2013-11-03 251 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