2015-12-09 4 views
0

Мне нужно сделать функцию, которая заменяет каждое слово (x) другим словом (y) в заданном тексте (** строка). Могу ли я заменить их непосредственно в данном тексте? Или я должен создать новый массив и сделать там замены? Однако и не знаю, как продолжить. Код я написал это:Заменить каждое слово другим словом в заданном тексте в C

void operation_2(char x[100], char y[100], char **string, int N) 
{ 
    int len = 0; 
    char *word; 
    char s[12] = " .,?!\"';:"; 
    char **newstring = (char **)malloc(N * sizeof(char *)); 

    for (i = 0; i<= N; i++) { 
      word = strtok(string[i], s); 
      while (word != NULL) { 
        if (strcmp(word, x) == 0) { 
          len = strlen(string[i]) - strlen(x) + strlen(y); 
          newstring[i] = (char *)malloc((len + 1) * sizeof(char)); 
+0

Если это назначение, то хорошо на вас работать самостоятельно. Если это для работы, то [как об этом] (http://www.engineersgarage.com/c-language-programs/replacing-word-text)? – NSNoob

+0

Я попробую. Спасибо. – RobertD

ответ

1

Если вы создаете новую строку, она будет в состоянии взять любую строку (строку литерал, массив в стеке, статический массив, массив в куче) как вход, но он не будет столь эффективным для памяти.

Если вам нужна максимальная эффективность памяти, вы можете изменить целевую строку на месте, но у вас будут ограничения в зависимости от того, где хранится входная строка.

  • строковый литерал или, возможно, константный статический массив, вы не можете ничего сделать, сделать что-нибудь с ним
  • стек, или статические: вы можете уменьшить его
  • кучу: вы можете realloc его (или уменьшить его развернуть)

Функция memmove может пригодиться, если вы решите изменить строку на месте.


Имейте в виду, однако, что:

  1. Там нет такого понятия, как аргументы массива в C. Они всегда распадаются на указатели.
  2. strtok изменит его вход, так что вам нужно сделать хотя бы одну копию, если вы решите пойти с strtok
+0

Текст хранится в куче. Я тоже пытался с 'strstr', но похоже, что он не работает так, как я хочу. Например, если у меня есть что-то вроде этого, «Джон должен купить десять яблок», и я ищу слово «яблоко», эта функция займет «яблоки» как хорошее слово. Для моей цели должна быть разница между яблоками и яблоками. – RobertD

+0

Затем, после того как вы нашли совпадение с strstr, вам нужно осмотреть его, чтобы определить, действительно ли это поиск резюме, если это не так. (Это как бы боль в прикладе, чтобы сделать все это в C.) – PSkocik

+0

Хорошо. Я постараюсь сделать что-то конкретное. Спасибо за помощь. Надеюсь, что я не буду сталкиваться с самой обожаемой ошибкой «Ошибка Segemntation». – RobertD

Смежные вопросы