这是一个程序:
首先,用户输入文本字符串(char text1;
);
然后我通过复制数组中的每个单词(char words[20][200]
);
我希望逐字逐句地比较字符串,并复制text1
字符串中不重复的每个字词。在text1
中重复的单词将在新字符串(char text2
)中“按原样”复制。
示例1:
如果用户输入“hello world
”
那么结果必须是“hello hello world world
”
示例2:
如果用户输入“weather is good weather
”
那么结果必须是“weather is is good good weather
”
问题如果我输入“hello world
”,那么在结果中我会收到“hello hello world
”。
我怎么解决这个问题?
以下是代码:
#include <stdio.h>
#include <string.h>
int main()
{
char text1[200], text2[200], words[20][100], *dist;
int i, j, nwords=0;
// Text input
printf("\n Enter the text: ");
gets(text1);
// Separate text word by word
dist = strtok(text1, " ,.!?");
i=0;
while(dist!=0)
{
strcpy(words[i],dist);
dist = strtok(NULL, " ,.!?");
i++;
nwords++;
}
// Task
if(nwords=1)
{
strcat(text2,words[0]);
strcat(text2," ");
strcat(text2,words[0]);
}
for(i=0; i<nwords-1; i++)
for(j=i+1; j<nwords; j++)
{
if(strcmp(words[i],words[j])==0)
{
strcat(text2,words[i]);
}
else
{
strcat(text2,words[i]);
strcat(text2," ");
strcat(text2,words[i]);
}
}
// Result
printf("\n\nInput:\n");
puts(text1);
printf("\n\nResult:\n");
puts(text2);
getchar();
return 0;
}
答案 0 :(得分:0)
您错误地使用了strtok(3)。它接受分隔符作为第二个字符串,而不是“分隔符”的“集合”。
来自gets(3):
永远不要使用gets()。
答案 1 :(得分:0)
根据您的问题描述,您的程序逻辑不正确。
我想逐字逐句地比较字符串并复制每个字 不会在text1字符串中重复。在text1中重复的单词 将在新字符串(char text2)中“按原样”复制。
如果您以“hello world”字符串为例,您的代码如下所示
for(i=0; i<=nvardi-1; i++)
for(j=i+1; j<nvardi; j++)
{
if(strcmp(vardi[i],vardi[j])==0)
{
strcat(text2,vardi[i]);
}
else
{
strcat(text2,vardi[i]);
strcat(text2," ");
strcat(text2,vardi[i]);
}
}
当内部循环将为“world”字符串运行时,它正在查看字符串的结尾。
要使其正确无误,请按以下步骤操作 -
看起来像这样 -
int flag_arr[20];
memset(flag_arr, 0, 20);
for(i=0; i <= nwords-1; i++) {
for(j=0; j<=nwords-1; j++)
{
if(strcmp(words[i],words[j])==0)
{
flag_arr[i] += 1;
}
}
}
for(i = 0; i <=nwords-1; i++)
{
if(flag_arr[i] > 1)
{
strcat(text2,words[i]);
}
else
{
strcat(text2,words[i]);
strcat(text2," ");
strcat(text2,words[i]);
}
}