簡體   English   中英

循環直到用戶在 C 中輸入正確

[英]Loop until user input is correct in C

我編寫了一個簡單的程序來顯示前 n 個質數,其中 n 由用戶輸入。 到目前為止,如果用戶寫入 integer,它可以正常執行。

但是,如果輸入不是 integer (primes(input).= 1),我希望程序繼續向用戶詢問有效輸入。

我嘗試創建一個循環(參見代碼)來執行此操作,但程序進入了無限循環。

例如,當用戶輸入一個字母時,程序會無限顯示“你想顯示多少 n 個第一素數?” 直到我退出。 由於某種原因,循環中的 scanf 被忽略了。

各種來源給了我不同的解釋,包括緩沖區問題。

發生這種無限循環的確切原因是什么?讓程序盡可能多地為用戶提供輸入正確之前的最佳方法是什么?

這是代碼:

#include <stdio.h>

int primes(int input);

int main(void)
{

  int input;
  
  printf("How many n first primes do you want to display? ");
  scanf("%d", &input);

    while(primes(input) != 1)
    {
    printf("How many n first primes do you want to display? ");
    scanf("%d", &input);
    }

  return 0;
}

int primes(int input)
{
  
  int count1 = 0, count2 = 0, b = 1, n = 2;
  
  if(input>=1) 
  {

      while (count1 < input)  
      { 
        b = 1;
        count2 = 0;
        while (b <= n)
        {
        
          if (n%b == 0)
          {

        count2++;
       
          }
         
          b++;
        
        }   
        
        if(count2 == 2)   
        {
        
          printf("%d\n",n);
          count1++;
         
        }
         
        n++;
          
      }

  return 1;
  
  }

  return 0;
              
}   

這真的取決於你的要求。

最簡單的方法是檢查scanf的返回值。 它基本上是這樣完成的:

if(scanf("%d", &input) != 1) {
    // Code for input failure
}

但是,上面會接受“7asdf”,這可能是可取的,也可能不是可取的。 它還會接受前導空格,如“7”。

如果你想要更細粒度的控制,你總是可以讀取一行然后手動解析它。 這是如何完成的想法:

char buf[100];
if( !fgets(buf, sizeof buf, stdin)) { // Read one line as input
    // Handle input error
}

buffer[strcspn(buffer, "\n")] = 0;  // Remove newline character because fgets leaves it there

int len = strlen(buffer);

for(int i=0; i<len; i++) {
    if( !isdigit((unsigned char)buffer[i]) ) {
        // Handle error
    }
}

上面的代碼不接受數字以外的任何其他字符。 例如,它會在前導或尾隨空格上失敗。

暫無
暫無

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

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