我正在使用多個scanfs編寫C程序,但是在運行它時,無論何時我正在讀取一個整數值的掃描,它都會跳過並放入一個開始執行無盡的循環。我甚至嘗試將每個scanfs分成多個函數,並且發生同樣的事情。我絕對不知道什麼是錯的,或者該怎麼做。scanf正在跳過掃描
回答
檢查返回值。出於某種原因,C庫函數返回狀態代碼。
人們用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.
驚人的答案,因爲幾乎沒有任何信息提供的問題 – 2011-03-01 03:25:48
@Matthew,我專門做每天早上吃早餐之前的6件不可思議的事情。或者,正如我的妻子指出的那樣,一旦我開始說話,任何缺乏熱核彈頭的東西都會使我閉嘴.-) – paxdiablo 2011-03-01 03:26:55
如果從標準輸入讀取,scanf函數就會從按下回報結束的緩衝區中讀取。
第一個scanf將採取你正在尋找的東西,但其餘的緩衝區將保留。
對於代碼:
int num;
scanf("%d", &num);
和輸入:
1 2 3 4 5
NUM將5,如所預期。但
2 3 4 5
仍然會在緩衝區中,您將運行不提示的另一個輸入,而是下一個scanf函數採取作爲輸入。
您的scanf可能正在讀取以前緩衝區中的殘差數據。
- 1. 掃描儀nextLine被跳過
- 2. 掃描儀對象跳過
- 3. 掃描器跳過條目
- 4. 跳過線,而文件掃描多行
- 5. Java掃描器跳過迭代
- 6. 掃描儀類和跳過模式
- 7. java掃描儀跳過最後輸入
- 8. 文件掃描器跳過線
- 9. scanf()跳過變量
- 10. Scanf跳過一行
- 11. scanf的被跳過
- 12. scanf(「%[^ \ n]」)被跳過
- 13. scanf()表達式被跳過
- 14. 在java中跳過掃描器輸入內部do while循環
- 15. 如何在Java掃描器中跳過分號
- 16. SonarQube掃描儀分析在travis中跳過CI
- 17. HBase掃描過濾器 - 跳過沒有所需列的行
- 18. scanf在visual studio中跳過行2015
- 19. scanf正在被跳過:如何讓用戶輸入?
- 20. scanf在非主函數中未掃描 - C
- 21. 爲什麼Tomcat的跳過DefaultJarScanner.jarsToSkip指定的掃描罐子
- 22. Java掃描器跳過一行破折號
- 23. 特拉維斯 - 信息:SonarQube掃描儀分析跳過
- 24. 如何跳過第三方jar的webflow定義(flow.xml)掃描
- 25. 爲什麼Oracle對此查詢使用跳過掃描?
- 26. Java掃描器跳過輸入nextLine()但不是next()
- 27. 掃描儀輸入跳過下一個輸入
- 28. 掃描儀跳過輸入,可能的空白?
- 29. Java掃描器nextDouble命令跳過切換大小寫的值?
- 30. 掃描輸入並跳過某些字符
你介意發佈一些代碼嗎? – 2011-03-01 02:20:39
也許你可以嘗試發佈你的代碼和一些示例輸入的結果,以幫助人們確切地理解你在做什麼? – MikeK 2011-03-01 02:21:17
複製粘貼我們的代碼! – slezica 2011-03-01 02:26:16