2010-09-06 150 views
0

所以,我有下面的代碼(C):scanf函數不會終止

char c = getc(in); 
if (c == '(') 
    ... 
if (c == '%') 
    ... 
if (isdigit(c)) 
{ 
    int n; 
    ungetc(c, in); 
    scanf("%i", &n); 
    ... 
} 

一切都很好,當我在輸入正在閱讀從標準輸入,但在輸入從一個讀取時花花公子文件,呼叫scanf不會終止。

我在呼叫前添加了一些代碼,以便在致電scanf之前查看發生了什麼。其中一個例子是後

  1. c = '0'
  2. 右側的字符c)

ungetc或東西后不沖水緩衝區?可能會發生什麼,當輸入是stdin但它不是文件時它可以正常工作? (我不熟悉C中的IO)。

編輯:應該使用fscanf ......男孩是我的臉紅。

+2

存儲getc'的'結果在'char'變量始終是錯誤的。 'getc'返回'int'。不過,這與你的問題是分開的。 – 2010-09-06 23:32:20

+0

感謝您的提示。 – Pete 2010-09-06 23:36:59

回答

1
  1. getc()將返回EOF當你01​​到達終點或發生錯誤,所以 確保您檢查。你的c必須是一個整數,而不是一個字符能夠區分EOF。

  2. 這同樣適用於scanf檢查其 EOF的返回值。對於scanf 轉換也可能失敗, scanf("%i", &n)應返回1如果 它成功地分析 到n因此請確保您也檢查 太1。

  3. 你也在getc(in)操作上in,如 ,提示你 從一個特定的文件*閱讀,但是 您scanf函數調用仍然讀取從標準輸入 。

    在那裏使用fscanf而不是scanf

+0

我已經確認'getc'和'ungetc'都是成功的,'c'肯定是一個可以作爲數字被掃描回來的數字。我無法檢查'scanf'的返回值,因爲它沒有終止。 (當我在調試器中斷程序時,它在'__kernel_vsyscall__'中被終止。) – Pete 2010-09-06 23:34:34

+0

儘管你仍然可以編寫代碼來檢查scaf的返回值。看到編輯,你可能想要從文件讀取時使用scanf從標準輸入讀取。 – nos 2010-09-06 23:36:54

+0

啊!很明顯...謝謝。 – Pete 2010-09-06 23:37:56

0

scanf()將從stdin文件描述符中取得輸入。如果重定向,那麼將採取適當的來源。 getc()將從任何文件描述符中讀取。您正在混合來自文件和標準輸入的輸入。

您可能對fscanf()更感興趣,從您的文件中讀取。

char c = getc(in); 
if (c == '(') 
    ... 
if (c == '%') 
    ... 
if (isdigit(c)) 
{ 
    int n; 
    ungetc(c, in); 
    fscanf(in, "%i", &n); 
    ... 
} 
0

在我的情況有一個無限循環低於scanf函數聲明的地方,除去無限循環:

unsigned long x,y; 
scanf("%llu%llu",&x,&y); 
while(i<=4) { 
if(list[i]>=x && list[i]<=y)   
count++;   
//i++;  
}