2016-03-01 66 views
3
#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    char string[100], word[20], max[20]; 
    int i = 0, j = 0, flag = 0; 
    printf("Enter string: "); 
    gets(string); 
    for (i = 0; i < strlen(string); i++) 
    { 
     while (i < strlen(string) && string[i]!=32 && string[i]!=0) //line 1 
     { 
      word[j++] = string[i++]; 
     } 
     if (j != 0) 
     { 
      word[j] = '\0'; 
      if (!flag) 
      { 
       flag = !flag; 
       strcpy(max, word); 
      } 
      if (strlen(word) > strlen(max)) 
      { 
       strcpy(max, word); 
      } 
      j = 0; 
     } 
    } 
    printf("The largest word is '%s' .\n", max); 
    return 0; 
} 

我碰到這個代碼,找到一個給定的字符串中的最長的單詞,並返回相同的長度字的多次出現的情況下,最後一個來到最長的串

(1)我不明白爲什麼輸出並不取決於max [],我的意思是我們最終打印出max []中最長的單詞,其大小爲max [20],但即使對於非常大的單詞,它也會給出正確的輸出,並將其更改爲max [10]作品。

(2)在第1行爲什麼我們測試string[i]!=0因爲除去這個沒有 的影響,我們已經在while循環的第一部分中測試了i < strlen(string)。但是,當我嘗試string[i]!='\0'我得到一些輸入字符串不正確的輸出。

我在哪裏錯過了這兩個邏輯?

@callyalater,我把MAX []之前字[]和string []但對輸出但最多[5],輸入字符串「arrenhius公式是難以破譯zxcvbnmlkjhgfdsaqwertyuiop」無效果的輸出是「arrenzxcvbnmlkjhgfdsaqwertyuiop '提供的在線編譯器鏈接,但對於max [10]工作良好,但在我的編譯器(dev C++)中,輸出給出了正確的結果,即max [5]和max [10],都是'zxcvbnmasdfghjklqwertyuiop'。

+1

在'strcpy'調用過程中,您可能在超出數組範圍的範圍內寫入'max'數組。如果覆蓋值不再被使用並且不會損壞堆棧,則輸出看起來是正確的。嘗試對'char []'的聲明進行重新排序,看看會發生什麼(即在'word'和'string'之前放置'max')。 – callyalater

+0

嘗試使用數組長度[here](http://ideone.com/tGP8Aj)來查看輸出結果。 (提示:它會告訴你如何通過你的數組邊界寫入內存。) – callyalater

+0

*「但是當我嘗試'string [i]!='\ 0''時,我得到了一些輸入字符串的錯誤輸出。你發佈了一個[mcve],其中包含一個重現問題的示例輸入? 'string [i]!= 0'確實是多餘的,並且等同於'string [i]!='\ 0''。 (除非我錯過了這裏。) –

回答

0
char string[100], word[20], max[20]; 
int i = 0, j = 0, flag = 0; 

在運行的最大,將修改i或詞

內存可以作爲以下

+-------+-------------+-------+ 
| word | max   | i  | 
+-------+-------------+-------+ 

+-------+-------------+-------+ 
| i  | max   | word | 
+-------+-------------+-------+ 

所以寫超過20個字節到最大,可以修改單詞,或我 - 當它超出。

當您超出這些內存項目時,會輸入未定義的行爲,這可能會起作用(如您找到的那樣)或崩潰。

string[i] !=0正在防範這些缺陷中的一些。