2011-11-23 96 views
1

我遇到了scanf()卡住的問題,繼續該程序的唯一方法是輸入exit。Scanf卡住

我的輸入是這樣的:

L 1 1 3 4 C 2 3 4 

,其中數字是L和C.

int main() 
{ 
// Get use input and put in array 
int count, x; 
int array[4]; 
char type; 

scanf("%c", &type); 

for (x = 0; x < 2; x++) 
{ 
    if (type == 'L') 
    { 
     for (count = 0; count < 4; count++) 
     { 
      scanf("%d", &array[count]); 
     } 

    } else if (type == 'C') 
    { 
     for (count = 0; count < 3; count++) 
     { 
      scanf("%d", &array[count]); 
     } 

    } 
    if (scanf("%*[ \n\t]%c", &type) == 0) 
    { 
     printf("Error"); 
     break; 
    } 
} 

scanf函數語句有問題的參數:

scanf("%*[ \n\t]%c", &type) 

作品好吧,如果我不是在線的末尾,但另有其他。但是,我不知道有多少個L和C對象,因此不能依賴for循環的值。

+0

我有點失落你的問題。該代碼正好讀取兩個塊(每個都是'L####'或'C###'),跳過空格,再讀一個字符,然後退出。它應該做什麼?你讓它聽起來像它應該保持閱讀 –

+0

目前它只讀了兩個,但我將它改爲一個while循環,以便我可以讀取未知數量的塊。我在閱讀所有的塊時遇到了困難,不過因爲閱讀最後一個字符時的scanf被卡住了,雖然從技術上講所有的字符都被讀過了,所以我猜這是它被卡住的原因。 – Denis

+0

檢查每個'scanf()'調用的返回值;它可能是其中一個失敗併爲下一個造成問題的其中一個。 –

回答

2

我覺得你的問題是在這裏:

if (scanf("%*[ \n\t]%c", &type) == 0) 

你嘗試檢查,如果你出的字符閱讀,所以要檢查是否scanf返回EOF(這是-1,只是使用EOF常量)。如果你打破,當你看到EOF返回你結束輸入過程中,你會盡快退出循環(按Ctrl +d在Linux上,我相信按Ctrl +ž在Windows中輸入

+0

謝謝。我認爲EOF是一個換行符,但顯然不是,所以我將使用getline()來讀取整行,所以我知道它是整個行。 – Denis

2

如果你的數據是面向行的,你可能會更好地使用POSIX 2008的fgets()或可能的getline()讀取行,然後使用sscanf()解析行。