【发布时间】:2018-01-11 21:05:43
【问题描述】:
我想使用 while 循环来不断询问用户正确的输入,直到给出。 scanf() 可以做到这一点吗?我知道如果输入不匹配,它会被保留为未分配并保存以供第二个 scanf() 捕获。
以下程序永远运行,当第一个输入错误时,不会要求我输入第二个输入。
#include<stdio.h>
/* Check the input, if the input does not contain a single integer value,
then keep asking for the integer value */
/* I used a counter variable so that the program does not run on forever */
int
main (int argc, char * argv[]){
int counter = 10, items = 0, input = 0;
while (counter){
printf("input an integer value: ");
items = scanf("%d",&input);
if (items == 1){
printf("successfully read an item");
break;
}
else{
counter --;
input = 0;
printf("failed to read an item, please try again\n");
}
}
return 0;
}
【问题讨论】:
-
据我所知,问题似乎是 scanf 在第二次被调用后没有暂停读取第二个输入。不知道如何解决这个问题,但我认为这是 OP 遇到的真正问题
-
尝试按 Ctrl-D 而不是直接返回
-
如果它一直在运行,这可能意味着您的文件流有错误,可能需要清除。
-
所以我刚刚做了一个测试用例:
int main(void) { int input; printf("A"); scanf("%d", &input); printf("B"); scanf("%d", &input); printf("C"); },我认为 OP 的一个简化问题是:如何在第一次给出无效输入后让 scanf 第二次触发跨度> -
我的beginners' guide away from
scanf()中涵盖了这个确切的(有缺陷的)尝试,您可能想阅读它。简而言之,scanf()是用来解析的,不是用来读取的;当它无法解析时,它也不会读取,所以它只是将东西留在输入缓冲区中。更好的循环,例如fgets()然后用atoi()、strtol()、strtod()、sscanf()等解析该行。