替换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]);
}
可能有几种不同的策略,如有必要,可以进一步定制。
- 将一个字符一次复制到目的地,向前扫描
find
并在找到时插入replace
,未找到原始字符; - 将一个单词一次复制到目的地,向前扫描
find
并在找到时插入replace
,找不到原始文本 – 您将需要此替换整个单词,而不是仅仅文字find
文本; - 使用库函数扫描
find
文本。
使用哪种策略取决于进一步(未提及)的要求,例如
- 区分大小写?
- 整个字只?
- 仅替换一次或所有事件?
- 可以
find
或replace
开头和/或以空格结尾,这些是重要的吗?
其中一个难点是评估新字符串所需的必要内存。 下面,我假设总有一个字符串找到并替换。 为了满足“任何”新的字符串长度,无需预先扫描find
和change
,更安全的做法是假设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