2011-03-01 120 views
0

我正在使用多個scanfs編寫C程序,但是在運行它時,無論何時我正在讀取一個整數值的掃描,它都會跳過並放入一個開始執行無盡的循環。我甚至嘗試將每個scanfs分成多個函數,並且發生同樣的事情。我絕對不知道什麼是錯的,或者該怎麼做。scanf正在跳過掃描

+1

你介意發佈一些代碼嗎? – 2011-03-01 02:20:39

+1

也許你可以嘗試發佈你的代碼和一些示例輸入的結果,以幫助人們確切地理解你在做什麼? – MikeK 2011-03-01 02:21:17

+1

複製粘貼我們的代碼! – slezica 2011-03-01 02:26:16

回答

2

檢查返回值。出於某種原因,C庫函數返回狀態代碼。

2

人們用scanf罷工的主要問題是數據不符合他們的預期。這可能會導致部分掃描,使您在文件中出乎意料的位置進行未來掃描。這個可能是是什麼導致你的無限循環,你通常會通過確保返回值是你所期望的(你嘗試掃描的項目的數量)來檢測它。沒有看到代碼就有點難以分辨。

C99狀態,在節7.19.6.4 The scanf function:如果任何轉換之前發生輸入故障

的scanf函數返回宏EOF的值。否則,scanf函數將返回分配的輸入項的數量,在發生早期匹配失敗的情況下,該項數可能少於規定的數量,甚至爲零。

但是,幾乎無一例外地,輸入應檢索爲,然後被處理從那裏與sscanf,因爲這允許一種簡單的方法來嘗試對不同格式字符串輸入數據進行多次掃描,多次需要弄清楚什麼格式的線是英寸

例如,下面的代碼是獲取用戶輸入緩衝區溢出保護檢測的一種安全的方式,以及緩衝器清除多餘所以輸入不影響下一次輸入操作:

#include <stdio.h> 
#include <string.h> 

#define OK  0 
#define NO_INPUT 1 
#define TOO_LONG 2 
static int getLine (char *prmpt, char *buff, size_t sz) { 
    int ch, extra; 

    // Get line with buffer overrun protection. 
    if (prmpt != NULL) { 
     printf ("%s", prmpt); 
     fflush (stdout); 
    } 
    if (fgets (buff, sz, stdin) == NULL) 
     return NO_INPUT; 

    // If it was too long, there'll be no newline. In that case, we flush 
    // to end of line so that excess doesn't affect the next call. 
    if (buff[strlen(buff)-1] != '\n') { 
     extra = 0; 
     while (((ch = getchar()) != '\n') && (ch != EOF)) 
      extra = 1; 
     return (extra == 1) ? TOO_LONG : OK; 
    } 

    // Otherwise remove newline and give string back to caller. 
    buff[strlen(buff)-1] = '\0'; 
    return OK; 
} 

您可以致電此代碼是這樣的:

char buff[50]; 
int rc = getLine ("What?> ", buff, sizeof(buff)); 
if (rc != OK) { 
    // Error condition, either EOF or to long. 
} 
// Now use sscanf on buff to your heart's content, 
// remembering to check the return value. 
+0

驚人的答案,因爲幾乎沒有任何信息提供的問題 – 2011-03-01 03:25:48

+1

@Matthew,我專門做每天早上吃早餐之前的6件不可思議的事情。或者,正如我的妻子指出的那樣,一旦我開始說話,任何缺乏熱核彈頭的東西都會使我閉嘴.-) – paxdiablo 2011-03-01 03:26:55

0

如果從標準輸入讀取,scanf函數就會從按下回報結束的緩衝區中讀取。

第一個scanf將採取你正在尋找的東西,但其餘的緩衝區將保留。

對於代碼:

int num; 
scanf("%d", &num); 

和輸入:

1 2 3 4 5 

NUM將5,如所預期。但

2 3 4 5 

仍然會在緩衝區中,您將運行不提示的另一個輸入,而是下一個scanf函數採取作爲輸入。

您的scanf可能正在讀取以前緩衝區中的殘差數據。