[英]C: scanf and program exit
我正在嘗試通過一些實踐練習來學習C編程。 例如,這應該讀取用戶輸入的2系列數字(每月的幾天)。
我遇到的問題是,在第一個系列運行正常之后,程序會跳過其他scanf命令並終止。
為什么?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int f = 0;
int days1[31];
int days2[31];
printf("Insert first serie \n");
while(scanf("%d",&days1[f])) {
f++;
}
// the following scanf loop is skipped
f = 0;
printf("Insert second serie \n");
while(scanf("%d",&days2[f])) {
f++;
}
}
謝謝
閱讀scanf的文檔。 它返回掃描項目的數量,您應該保留並測試它。 它可能在失敗時返回-1(這被視為真實值),然后不消耗任何輸入。 它的%n
轉換說明符通常是有用的,並且知之甚少。
所以代碼
while(f < 31 && scanf("%d",&days1[f])>0) f++;
但是您可能需要以使scanf
失敗的方式結束第一個系列,然后需要跳過該方式。 您應該定義並記錄有關此的約定。 假設您將鍵入分號;
那么您可能會編寫代碼:
f=0;
while(f < 31 && scanf("%d",&days1[f])>0) f++;
if (getchar() != ';') exit(EXIT_FAILURE);
f=0;
while(f < 31 && scanf("%d",&days2[f])>0) f++;
我不確定上述工作。 您可能需要注意空格或空行。 您可以使用fgets
或getline
讀取每一行並解析每一行(使用sscanf
或strtol
)。
實際上,我建議聲明一個足夠大的緩沖區char buf[256];
,請使用fgets
讀取包含所有數字系列的單行 ,然后在循環中使用strtol
解析該行,並關心賦予strtol
的結束指針。
您需要記錄輸入格式,至少作為注釋。 您可以為此使用EBNF表示法,然后使用標准解析技術。
當然,您應該編譯所有警告和調試信息(例如,如果使用GCC ..., gcc -Wall -Wextra -g
)。 然后學習使用調試器 (例如gdb
)。 這是必須具備的技能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.