在C中替换字符串中的单词

时间:2014-11-26 22:35:29

标签: c string

我正在寻找一种替换字符串中单词/单词的方法。 让我们说如果我使用这样的函数:

changewords("Hello I'm Number One","Number One","Zero");

输出将如下:"你好我是第一号" - > "你好,我是零"

但更多时候我也只能替换一个单词

changewords("Hello I'm Number One","One","Four");
像这样:"你好,我是第一名" - > "你好我是第四个"

在我的代码中,我将句子分成单词并将每个单词与我需要更改的单词进行比较,但是我能够以这种方式只改变一个单词,任何人都可以建议如何正确地做到这一点吗? 谢谢。 这是我的代码,它使用矩阵(表格)中的一行作为句子,行号是sentenceToChange变量。

int changewords (char table[][MAX_SENTENCE_LENGTH], int numOfSentences, int sentenceToChange, char subString[],char replaceWith[]){
int slen,i=0,q=0,c=0;
char wordlist[100][100];
char final[1][100];
slen=strlen(table[sentenceToChange]);
for(i=0;i<slen;i++) {
    if(table[sentenceToChange][i]!=' '){
        wordlist[q][c]=table[sentenceToChange][i];
    c++;
    }
    else { 
        wordlist[q][c]='\0';
        c=0;
        q++;
    }
}
for(i=0;i<q;i++) {
if (!strcmp(wordlist[i],subString)) {
strcpy(wordlist[i],replaceWith);
}
}
final[0][0]='\0';
for(i=0;i<=q;i++) {
strcat(final[0],wordlist[i]);
if(i!=q) strcat(final[0]," ");
}
final[0][slen-1]='\0';
strcpy(table[sentenceToChange],final[0]);

}

3 个答案:

答案 0 :(得分:2)

上面提到的关于strstr的内容是可行的。事实上这里有一个例子 http://www.cplusplus.com/reference/cstring/strstr/

如果您因某些原因无法使用strstr,则可以执行以下操作。

1)逐个字符地搜索第一个字符串,查找要替换的单词的第一个字符。找到后,保存该位置的索引。

2)找到第一个字符后,继续验证每个字符是否匹配,如果没有,请返回步骤1.

3)当你到达要替换的字符串的末尾时,保存该位置的索引。

4)将正在进行替换的字符串的剩余字符保存到临时字符串中。

5)将替换字符复制到步骤1中找到的索引。

6)将保存的字符从临时字符串COpy到步骤1中索引所指示的位置加上替换字符的长度。

无论您使用何种方法,都需要记住一些非常重要的事情。

1)确保为新字符串分配的内存足以容纳替换字符串,因为替换字符串可能比原始字符串长。

2)将空字符放在新字符串的末尾。

答案 1 :(得分:2)

可能有几种不同的策略,如有必要,可以进一步量身定制。

  1. 一次将一个字符复制到目的地,向前扫描find并在找到时插入replace,找不到原始字符;
  2. 一次将一个复制到目的地,向前扫描find并在找到时插入replace,找不到原始文字 - 你需要这个替换整个单词,而不仅仅是文字find文本;
  3. 使用库函数扫描find文本。
  4. 使用哪种策略取决于进一步(未提及)的要求,例如

    1. 区分大小写?
    2. 仅限全文?
    3. 仅替换一次或全部出现?
    4. findreplace可以以空格开头和/或结尾,这些是重要的吗?
    5. 其中一个难点是评估新字符串所需的必要内存。下面,我假设总有一个字符串找到并替换。为了满足“任意”新的字符串长度,而无需预先扫描findchange,更安全的做法是假设sentence中的每个字符都可以替换为replace };也就是说,目标占用的最大内存量为strlen(sentence)*strlen(replace)+1(+1,一如既往地将终止零存储在其中)。

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      char *changewords_1 (char *sentence, char *find, char *replace)
      {
          char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1);
          char *destptr = dest;
      
          *dest = 0;
      
          while (*sentence)
          {
              if (!strncmp (sentence, find, strlen(find)))
              {
                  strcat (destptr, replace);
                  sentence += strlen(find);
                  destptr += strlen(replace);
              } else
              {
                  *destptr = *sentence;
                  destptr++;
                  sentence++;
              }
          }
          *destptr = 0;
          return dest;
      }
      
      char *changewords_2 (char *sentence, char *find, char *replace)
      {
          char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1);
          char *destptr = dest;
      
          *dest = 0;
      
          while (*sentence)
          {
              if (!strncmp (sentence, find, strlen(find)) &&
                  (sentence[strlen(find)] == 0 || sentence[strlen(find)] == ' '))
              {
                  strcat (destptr, replace);
                  sentence += strlen(find);
                  destptr += strlen(replace);
              } else
              {
                  while (*sentence && *sentence != ' ')
                  {
                      *destptr = *sentence;
                      destptr++;
                      sentence++;
                  }
                  while (*sentence == ' ')
                  {
                      *destptr = *sentence;
                      destptr++;
                      sentence++;
                  }
              }
          }
          *destptr = 0;
          return dest;
      }
      
      char *changewords_3 (char *sentence, char *find, char *replace)
      {
          char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1);
          char *ptr;
      
          strcpy (dest, sentence);
      
          ptr = strstr (dest, find);
          if (ptr)
          {
              memmove (ptr+strlen(replace), ptr+strlen(find), strlen(ptr+strlen(find))+1);
              strncpy (ptr, replace, strlen(replace));
          }
      
          return dest;
      }
      
      
      int main (void)
      {
          char *result;
      
          result = changewords_1 ("Hello I'm Number One","Number","Index");
          printf ("[%s]\n", result);
          free (result);
      
          result = changewords_2 ("Here Is The Onerous Number One ...","One","Four");
          printf ("[%s]\n", result);
          free (result);
      
          result = changewords_3 ("Here Is Number One Again","One","Fourty-Five Hundred");
          printf ("[%s]\n", result);
          free (result);
      
          return 0;
      }
      

      ..显示输出:

      [Hello I'm Index One]
      [Here Is The Onerous Number Four ...]
      [Here Is Number Fourty-Five Hundred Again]
      

答案 2 :(得分:1)

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="This is a simple string made with simple code";
  char * pch;
  int i=0,count=0;
  for(i=0;i<strlen(str);i++){
    if(str[i]=='s'&& str[i+1]=='i'&&str[i+2]=='m'&&str[i+3]=='p' && str[i+4]=='l' && str[i+5]=='e'){
        count++;
      }
  }
  for(i=1;i<=count;i++){
    pch = strstr (str,"simple");
    strncpy (pch,"sample",6);
  }

  puts (str);
  return 0;
}