/* * * Программа решает задачу: Дана строка символов. Группы символов, * разделенные пробелами (одним или несколькими) и не содержащие пробелы * внутри себя, будем называть словами. * Заменить в строке слова S на слова W ( S, W - заданы). * * */
// Подпрограмма определяет, является ли группа символов словом. bool isWordc (const char*const str, const char*const begin, int len);
// #pragma argsused int main(int argc, char* argv[]) {
const char*const def_str = "Ехал грека через реку , видит грека – в реке рак. Сунул грека руку в реку, рак за руку греку – цап! рекурсия рукавицы"; const char* S[] = { "грека", "реку", "руку", "рак", "ААА" }; const char* W[sizeof(S) / sizeof(char*)] = { "ААА", "поле", "ногу", "мышь", "Грека" }; const int countS = sizeof(S) / sizeof(char*); int i, offset, delta, isWord; char* pos; char* str = (char*)malloc(strlen(def_str)+1); if (!str) return 1; memcpy(str, def_str, strlen(def_str)+1);
for ( i = 0; i < countS; ++i) { pos = str; while ((pos = strstr(pos, S[i])) != NULL) { // Группы символов, разделенные пробелами, будем называть словами. if (isWordc(str,pos,strlen(S[i])) == true) { if (strlen(S[i]) != strlen(W[i])) { // При разной длине - компенсируем разницу, т.е при замене рак на раковина не должны портиться другие данные. delta = strlen(S[i]) - strlen(W[i]); if (delta < 0) { offset = pos - str; str = (char*)realloc(str, strlen(str) + 1 - delta ); if (!str) return 1; str[strlen(str) - delta] = '\0'; pos = str + offset; memmove(pos - delta, pos, strlen(pos)); } memset(pos, SPACE, MAX(strlen(W[i]), strlen(S[i]))); // Замена "грека" на "АА" = "АА___" } strncpy(pos, W[i], strlen(W[i])); } pos += strlen(S[i]); } } free(str);
return 0; } //
// // Подпрограмма определяет, является ли группа символов словом. bool isWordc(const char*const str, const char*const begin, int len) { bool lhs,rhs; // ( рак и раковина разные слова.) // Приведение к (unsigned char) необходимо т.к. функции isspace и ispunct делают проверку (A>-1 && A<=255). lhs = (begin == str); // Исключаем выход за границы. lhs = lhs || (isspace((unsigned char) *(begin - 1)) || ispunct((unsigned char) *(begin - 1))); rhs = isspace((unsigned char) *(begin + len))|| ispunct((unsigned char) *(begin + len)); return lhs && rhs; } //
Salnikov1730
01.12.2022
1)Потому что информацию мы в скором времени забудем. А оперативная память-временная. Примеры:кол-во денег которое мне надо взять с собой что бы доехать завтра до вокзала; номера упражнений по геометрии которые надо сделать дома до завтра. 2)Достоинства оперативной памяти: не занимает место в долговременной, через некоторое время удалится(если речь про компьютер); позволяет возвращать несколько действий назад(например в ворде) Недостатки: загружает компьютер; малое кол-во памяти Достоинства долговременной памяти: почти не затормаживает компьютер; большое кол-во памяти Недостатки: Поиск файлов может занять некоторое время; не вся информация может туда загрузится
/*
*
* Программа решает задачу: Дана строка символов. Группы символов,
* разделенные пробелами (одним или несколькими) и не содержащие пробелы
* внутри себя, будем называть словами.
* Заменить в строке слова S на слова W ( S, W - заданы).
*
*
*/
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define bool int
#define true 1
#define false 0
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define SPACE ' '
// Подпрограмма определяет, является ли группа символов словом.
bool isWordc (const char*const str, const char*const begin, int len);
//
#pragma argsused
int main(int argc, char* argv[])
{
const char*const def_str = "Ехал грека через реку , видит грека – в реке рак. Сунул грека руку в реку, рак за руку греку – цап! рекурсия рукавицы";
const char* S[] = { "грека", "реку", "руку", "рак", "ААА" };
const char* W[sizeof(S) / sizeof(char*)] = { "ААА", "поле", "ногу", "мышь", "Грека" };
const int countS = sizeof(S) / sizeof(char*);
int i, offset, delta, isWord;
char* pos;
char* str = (char*)malloc(strlen(def_str)+1);
if (!str) return 1;
memcpy(str, def_str, strlen(def_str)+1);
for ( i = 0; i < countS; ++i) {
pos = str;
while ((pos = strstr(pos, S[i])) != NULL) {
// Группы символов, разделенные пробелами, будем называть словами.
if (isWordc(str,pos,strlen(S[i])) == true) {
if (strlen(S[i]) != strlen(W[i])) {
// При разной длине - компенсируем разницу, т.е при замене рак на раковина не должны портиться другие данные.
delta = strlen(S[i]) - strlen(W[i]);
if (delta < 0) {
offset = pos - str;
str = (char*)realloc(str, strlen(str) + 1 - delta );
if (!str) return 1;
str[strlen(str) - delta] = '\0';
pos = str + offset;
memmove(pos - delta, pos, strlen(pos));
}
memset(pos, SPACE, MAX(strlen(W[i]), strlen(S[i]))); // Замена "грека" на "АА" = "АА___"
}
strncpy(pos, W[i], strlen(W[i]));
}
pos += strlen(S[i]);
}
}
free(str);
return 0;
}
//
//
// Подпрограмма определяет, является ли группа символов словом.
bool isWordc(const char*const str, const char*const begin, int len) {
bool lhs,rhs; // ( рак и раковина разные слова.)
// Приведение к (unsigned char) необходимо т.к. функции isspace и ispunct делают проверку (A>-1 && A<=255).
lhs = (begin == str); // Исключаем выход за границы.
lhs = lhs || (isspace((unsigned char) *(begin - 1)) || ispunct((unsigned char) *(begin - 1)));
rhs = isspace((unsigned char) *(begin + len))|| ispunct((unsigned char) *(begin + len));
return lhs && rhs;
}
//