我正在寻找一种方法来替换字符串中的单词。 假设我使用这样的函数:
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
或replace
能否以空格开头和/或结尾,这些重要吗?
比较困难的事情之一是评估新字符串所需的必要内存。下面,我假设总能找到并替换一个字符串。为了迎合“任何”新字符串长度,无需预先扫描find
和change
,更安全的做法是假定句子
中的每个字符可能可以用 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]
关于c - 替换C中字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27160073/