2012-12-02 65 views
1

我想輸入到數組,直到用戶輸入-1退出輸入模式。C代碼掛在scanf()語句

當輸入-1但只有至少兩個值被輸入後,這段代碼纔會出現奇怪的現象。

#define ARRAYSIZE 100 
int input[ARRAYSIZE]; 
int i=0; 
do { 
    printf("Enter data #%d or -1 to exit: ", i); 
    scanf("%d", &input[i]); 
} while(input[i++] != -1 && i<ARRAYSIZE) 

該代碼將無限期掛起。我已經編譯並在兩個獨立的體系結構上運行,但在gdb中運行時不會顯示問題。

插入打印語句顯示代碼確實掛在了scanf語句中。

有沒有人有任何想法可能會導致此?

+0

呃,沒它仍然掛你點擊「回車」後?是否將「input []」聲明爲具有一個或多個「int」元素的整數數組?在進入循環之前,「我」初始化爲0嗎? – paulsm4

+0

是的,謝謝你我已經編輯了這個問題來清除這個問題 –

+0

什麼是條目?爲什麼不只是'輸入[i ++]!= - 1'作爲退出檢查? – asheeshr

回答

2

你從未檢查你保存的數據的價值(這是檢查下一個未初始化的元素),請同時是一個更適合

#define ARRAYSIZE 100 
int input[ARRAYSIZE],i=0; 
do {printf("Enter data #%d or -1 to exit: ", i); 
    scanf("%d", &input[i]); 
}while(input[i] != -1 && ++i<ARRAYSIZE); 
//if this is main() you need a return 0; here also or it will hang 
+1

+1你用秒鐘打敗我..即將發佈相同的邏輯。 – exexzian

+0

@sansix可能是因爲我節省了時間忘記把-ing的第二次檢查:) – technosaurus

+0

哈哈哈,可能是這種情況:) – exexzian

0

我的問題:

3)爲 「I」 初始化爲0,你進入循環之前?

2)「input []」被聲明爲一個具有一個或多個「int」元素的整數數組嗎?

......還有......

1)它是否仍掛你打 「Enter」 之後?

如果你尚未意識到這一點,你必須命中 scanf的前「輸入」()將處理任何輸入。

建議:

#include <stdio.h> 
#define ARRAYSIZE 100 

int 
main() 
{ 
    int input[ARRAYSIZE]; 
    int i=0; 
    int entry=0; 
    while(entry != -1 && i<ARRAYSIZE) { 
    printf("Enter data #%d or -1 to exit: ", i); 
    scanf("%d", &input[i]); 
    entry = input[i]; 
    fprintf (stderr, "entry= %d, input[i]= %d...\n", entry, input[i]); 
    i++; 
    } 
    printf ("Done.\n"); 
    return 0; 
} 

注意 「fprintf中(錯誤)」。

輸出樣本:

Enter data #0 or -1 to exit: 300 
entry= 300, input[i]= 300... 
Enter data #1 or -1 to exit: -1 
entry= -1, input[i]= -1... 
Done. 

再次 - 請說明您是否正在使用的 「Enter」 鍵。如果是這樣,請讓我們知道您的平臺(例如Windows,Linux,MacOS等)。

「希望幫助...

+1

您的問題應該是實際問題下的註釋。 – asheeshr

+0

「入口」在哪裏申報? – AnT

+0

@AndreyT - 謝謝你:) – paulsm4

0

你的代碼依賴於未初始化數組元素的值。難怪它的行爲不合理。

在您的while週期條件下,您將input[i]-1進行比較。在每次迭代input[i]都沒有初始化 - 它包含一個垃圾值。由於垃圾值不太可能等於-1,因此您的週期會繼續運行並運行,並且每次都會在scanf處停止等待輸入。這產生了「掛在scanf」的錯覺,而實際上,scanf本身與真正的問題無關。

當然,真正的問題在這裏是不是該數組未初始化,而是你的循環條件檢查錯誤數組元素。您可能打算檢查最近輸入的元素。相反,你檢查下一個元素。爲什麼?

我想說,你的意圖要求與條件週期。

0

使用不同的變量來檢查-1。事情是這樣的:

#include <stdio.h> 
#define ARRAYSIZE 10 

int main(int argc, char **argv) { 
    int data[ARRAYSIZE]; 
    int input = 0; 
    int i = 0;  

    while(input != -1 && i < ARRAYSIZE) { 
     scanf("%d", &input); 
     data[i] = input; 
     i++; 
    } 

    return 0; 
}