簡體   English   中英

C:scanf和程序退出

[英]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++;

我不確定上述工作。 您可能需要注意空格或空行。 您可以使用fgetsgetline讀取每一行並解析每一行(使用sscanfstrtol )。

實際上,我建議聲明一個足夠大的緩沖區char buf[256]; ,請使用fgets讀取包含所有數字系列的單行 ,然后在循環中使用strtol解析該行,並關心賦予strtol的結束指針。

您需要記錄輸入格式,至少作為注釋。 您可以為此使用EBNF表示法,然后使用標准解析技術。

當然,您應該編譯所有警告和調試信息(例如,如果使用GCC ..., gcc -Wall -Wextra -g )。 然后學習使用調試器 (例如gdb )。 這是必須具備的技能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM