#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'。
在'strcpy'調用過程中,您可能在超出數組範圍的範圍內寫入'max'數組。如果覆蓋值不再被使用並且不會損壞堆棧,則輸出看起來是正確的。嘗試對'char []'的聲明進行重新排序,看看會發生什麼(即在'word'和'string'之前放置'max')。 – callyalater
嘗試使用數組長度[here](http://ideone.com/tGP8Aj)來查看輸出結果。 (提示:它會告訴你如何通過你的數組邊界寫入內存。) – callyalater
*「但是當我嘗試'string [i]!='\ 0''時,我得到了一些輸入字符串的錯誤輸出。你發佈了一個[mcve],其中包含一個重現問題的示例輸入? 'string [i]!= 0'確實是多餘的,並且等同於'string [i]!='\ 0''。 (除非我錯過了這裏。) –