2013-02-13 132 views
1

我有下面的代碼,它將來自用戶的字符串輸入存儲在多維數組中。然後打印出第二個元素。在多維數組中存儲和檢索字符串

main() 
{ 

    // Array to store 10 strings, 20 characters long. 
    char strStorage[10][20]; 

    printf("\nEnter how many strings: "); 
    scanf("%d" , &num); 
    fflush(stdin); 

    for (count = 0 ; count < num ; count++) 
    { 
     printf("Enter a string: "); 
     gets(strStorage[count]); 
     fflush(stdin); 
    } 

    printf("%s", strStorage[2]); 

最後一行輸出垃圾。用戶輸入在垃圾內不可見,因此無論我的元素訪問是錯誤還是存儲錯誤。任何人都可以幫助我解決問題是什麼?

在此先感謝...

+0

如果用戶輸入超過19個字符會怎麼樣? http://stackoverflow.com/questions/1694036/why-is-the-gets-function-is-dangerous-why-should-not-be-used – hmjd 2013-02-13 12:28:29

+3

'fflush(stdin);'是未定義的行爲! – 2013-02-13 12:28:43

+0

你的樣本輸入是什麼? – Rohan 2013-02-13 12:29:00

回答

3

strStorage[2]第三字符串,因此,如果num小於,你不會初始化它,它會包含垃圾。

+0

嗯im輸入4個字符串測試,它仍然是垃圾。即使strStorage [0]不起作用 – kype 2013-02-13 12:39:21

+0

我使用調試器在VS中測試了您的代碼,並驗證了我上面聲明的內容。請您複製您使用的*整個*程序代碼以及當num爲4時輸入的4個字符串?我會檢查它。 – kol 2013-02-13 12:46:22

+0

重新啓動我的操作系統,現在它工作。謝謝您的幫助。 – kype 2013-02-13 13:05:20

0

scanf("%d", &num);不確保num包含一個值。也許這是明智的,以檢查scanf的返回值,以確保它讀取1值,如下所示:if (scanf("%d", &num) != 1) { puts("Error reading integer"); }

雖然我們在這個主題上,我認爲num和count被聲明爲一個int,已經隱藏了我們的聲明。 Tsssk!你想要我們的幫助嗎?如果是這樣,那麼讓你的代碼可編譯!你真的認爲int適合存儲索引到數組嗎?他們可能有負面的價值。我建議使用size_t,取而代之的是,格式說明符%zu告訴scanf預期來自stdin的size_t值。

...當size_t包含的值大於數組中元素的數量時會發生什麼?我建議研究變長度數組。

fflush(stdin);是無稽之談,因爲fflush定義了打開輸出文件的行爲,而stdin是一個僅用於輸入的文件。這就像沖洗馬桶,並期待垃圾從碗裏出來,而不是通過S形彎曲。也許你的意思是放棄一行的其餘部分,因爲你從一開始就讀了你需要的數據。像for (int c = getchar(); c >= 0 && c != '\n'; c = getchar());可能工作。

請勿使用gets。改爲使用fgets(strStorage[count], sizeof strStorage[count], stdin);,以確保不發生緩衝區溢出。

在那裏,我想我幾乎涵蓋了每一點未定義的行爲和挑剔的東西。