我正在寻找一种替换字符串中单词/单词的方法。 让我们说如果我使用这样的函数:
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]);
}
答案 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)
可能有几种不同的策略,如有必要,可以进一步量身定制。
find
并在找到时插入replace
,找不到原始字符; find
并在找到时插入replace
,找不到原始文字 - 你需要这个替换整个单词,而不仅仅是文字find
文本; find
文本。使用哪种策略取决于进一步(未提及)的要求,例如
find
或replace
可以以空格开头和/或结尾,这些是重要的吗?其中一个难点是评估新字符串所需的必要内存。下面,我假设总有一个字符串找到并替换。为了满足“任意”新的字符串长度,而无需预先扫描find
和change
,更安全的做法是假设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;
}