簡體   English   中英

輸入無效的循環中的C scanf

[英]C scanf in a loop with invalid input

我必須執行if語句,否則,如果設置了一些無效的輸入(例如“ 17d”),它將陷入無限循環。 為什么呢 我認為有緩沖區但scanf從stdin讀取而不是從流讀取?

  int age;

  while (age != 0) {
    printf("How old are you? ");

    if(scanf("%d", &age) > 0) {
      printf("You are %d years old!\n", age);  
    } else {
      break;
    }

  }

scanf不成功時,它將輸入scanf在流中。 您需要忽略該行的其余部分,並要求用戶再次提供輸入。 您可以添加以下功能:

void ignoreRestOfLine(FILE* fp)
{
   int c;
   while ( (c = fgetc(fp)) != EOF && c != '\n');
}

並從main調用它:

if(scanf("%d", &age) > 0) {
  printf("You are %d years old!\n", age);  
} else {
  // Ignore rest of the line and continue with the loop.
  ignoreRestOfLine(stdin);
}

另一個選擇是一次讀取一行中的數據,然后使用sscanf從該行中提取數字。

char line[100]; // Make it large enough
while (age != 0)
{
   printf("How old are you? ");

   if ( fgets(line, sizeof(line), stdin) == NULL )
   {
      // Problem reading a line of text.
      // Deal with it.
      break;
   }
   else
   {
      if(sscanf(line, "%d", &age) > 0)
      {
         printf("You are %d years old!\n", age);  
      }
   }

   // Try to read again
}

暫無
暫無

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

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