在C中逐字比较字符串

时间:2013-11-03 18:34:32

标签: c string

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

2 个答案:

答案 0 :(得分:0)

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

  2. 来自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”字符串运行时,它正在查看字符串的结尾。

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

  1. 计算字符串中相似单词的数量,并将其存储为数组。
  2. 如果单词数量多于一次,则只复制一次。
  3. 看起来像这样 -

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