0

这是一个程序:首先,用户输入一个文本字符串(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;
}
4

2 回答 2

0
  1. 您错误地使用了 strtok(3)。它接受分隔符作为第二个字符串,而不是分隔符的“集合”。

  2. 从获得(3):

    永远不要使用gets()。

于 2013-11-03T18:42:50.847 回答
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]);
        }                                             
    }

当内部循环将为“世界”字符串运行时,它正在查看字符串的末尾。

要使其正确,请按照以下步骤操作 -

  1. 计算字符串中相似词的数量,并将其存储为数组。
  2. 如果单词数不止一次,则只复制一次。

它看起来像这样 -

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

}
于 2013-11-03T19:25:35.933 回答