[英]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.