[英]scanf skipped after reading in integer in C, in while loop
我有一段代碼,我檢查scanf的輸入是否有效。 即如果scanf返回非零正數。 這是我的代碼的一部分:
while(scanf(" %d",&choice)<=0){
printf("Incorrect value entered, please re-enter\n");
}
其中“選擇”是整數。
每次運行此代碼時,編譯器都會在執行while循環后跳過scanf。 我得到這樣的輸出:
歡迎來到捕食者/獵物計算器
請輸入你的名字
丹嗨丹
請選擇以下選項之一:1。計算典型捕食者和獵物系統的演變2.計算特定捕食者和獵物系統的演變3.計算CUSTOM捕食者和獵物系統的演變0.退出不正確的值輸入,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入輸入的錯誤值,請重新輸入-enter輸入的值不正確,請重新輸入輸入的錯誤值,請重新輸入
你能解釋一下為什么會這樣嗎 我似乎無法在互聯網上找到任何特定於整數閱讀的答案。
非常感謝,
你的代碼的問題是,如果用戶沒有輸入數字,你的程序將永遠循環。 這是因為scanf
會反復嘗試解析相同的字符串並繼續失敗。 你要做的就是匹配用戶寫的任何內容,然后再次詢問一個數字:
#include<stdio.h>
int main(){
int choice;
while(scanf("%d",&choice) <= 0){
scanf("%*s"); // this will parse anything the user has written
printf("Incorrect value entered, please re-enter\n");
}
return 0;
}
scanf格式字符串中的*是分配抑制字符,來自scanf手冊頁:
'*'賦值 - 抑制字符:scanf()按轉換規范的指示讀取輸入,但丟棄輸入。 不需要相應的指針參數,並且此規范不包含在scanf()返回的成功分配計數中。
編輯首先抱怨scanf()
返回成功轉換的字段數。 接下來的問題是scanf
會在輸入中留下未轉換的字符,並會嘗試再次轉換這些相同的字符。 在duff輸入后,您可以清除輸入,如下所示:
#include <stdio.h>
#define MAXCHOICE 42
int main(void)
{
int choice, ch;
while(scanf("%d",&choice) != 1 || choice < 1 || choice > MAXCHOICE){
printf("Incorrect value entered, please re-enter\n");
while((ch = getchar(stdin)) != '\n'); // clear the input
}
printf("Choice %d\n", choice);
return 0;
}
計划會議:
100
Incorrect value entered, please re-enter
a
Incorrect value entered, please re-enter
5
Choice 5
可能這就是你需要的:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int choice,repeat = 0;
do{
printf("Give a Number: ");
if((scanf("%d",&choice)) != 1){
printf("ErrorFix it!\n");
exit(1);
}else{
if(choice > 0){
printf("OK\n");
repeat = 0;
}else{
printf("Incorrect value entered, please re-enter\n");
repeat = 1;
}
}
}while(repeat == 1);
printf("Your typed %d\n",choice);
return 0;
}
輸出:
Give a Number: 0
Incorrect value entered, please re-enter
Give a Number: -5
Incorrect value entered, please re-enter
Give a Number: 10
OK
Your typed 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.