替换C中字符串中的单词

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

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]); 

}

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

  1. 将一个字符一次复制到目的地,向前扫描find并在找到时插入replace ,未找到原始字符;
  2. 将一个单词一次复制到目的地,向前扫描find并在找到时插入replace ,找不到原始文本 – 您将需要此替换整个单词,而不是仅仅文字find文本;
  3. 使用库函数扫描find文本。

使用哪种策略取决于进一步(未提及)的要求,例如

  1. 区分大小写?
  2. 整个字只?
  3. 仅替换一次或所有事件?
  4. 可以findreplace开头和/或以空格结尾,这些是重要的吗?

其中一个难点是评估新字符串所需的必要内存。 下面,我假设总有一个字符串找到并替换。 为了满足“任何”新的字符串长度,无需预先扫描findchange ,更安全的做法是假设sentence每个字符都可以替换为replace ; 也就是说,目标占用的最大内存量是strlen(sentence)*strlen(replace)+1 (+1,一如既往地用于存储终止零)。

 #include  #include  #include  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] 

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

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

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

2)找到第一个字符后,继续validation每个字符是否匹配,如果不匹配,则返回步骤1。

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

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

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

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

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

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

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

 #include  #include  int main () { char str[] ="This is a simple string made with simple code"; char * pch; int i=0,count=0; for(i=0;i