2013-11-03 150 views
0

这是一个程序: 首先,用户输入一个文本字符串(char text1;); 然后,我通过复制数组中的每个单词来分隔字符串(char words[20][200]);在C中逐字比较字符串

我想比较单词字符串并重复在text1字符串中doensn't不重复的每个单词。在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

'nvardi'?你的意思是nwords。 –

+0

是的,抱歉我的错误。应该有“黑客”。 – Kurbads

回答

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

} 
+0

所以你的意思是 - 1.我需要计算每个单词在字符串中重复的次数; 2.如果当前单词重复多次,则只将其复制到text2中一次,但如果不重复,则将其复制到text2字符串中。 我说得对吗? – Kurbads

+0

是的。请看编辑的代码,希望它能帮助你。 – Gaurav

+0

谢谢,它几乎做到了。但是有一个问题 - 如果我输入“天气是好天气”,那么结果就是“天气是好的好天气”。但在这种情况下,字符串单词“天气”的末尾不应该重复。我怎么能解决这个问题? – Kurbads

0
  1. 您使用的strtok(3)不正确。它接受分隔符作为第二个字符串,而不是一组“分隔符”。

  2. 从得到(3):

    不要使用gets()函数。

+0

Um ..'strtok()'的第二个参数是字符的终止*字符串*,*其中每个*都被认为是允许的分隔符。 [见文档](http://en.cppreference.com/w/c/string/byte/strtok)。 – WhozCraig

+0

哦,是的,我的不好。是时候睡觉了。 – JIghtuse