// program to detect whether only integer has been given or not
int main() {
int a, b, s;
printf("Enter two proper number\n");
BEGIN:
s = scanf("%d %d", &a, &b); //storing the scanf return value in s
if (s != 2) {
printf("enter proper value\n");
goto BEGIN;
}
printf("The values are %d and %d ", a, b);
}
此程序用于检测在输入无效数据而不是要求新值时是否仅给出整数而进入无限循环
goto
为什么在这里不起作用?
答案 0 :(得分:1)
请注意,当scanf
输入错误(例如,输入 cat dog )时,该输入将保留在输入缓冲区中,直到您采取措施将其清除为止。因此,循环会不断重复并拒绝仍然存在的相同输入。
使用fgets
和sscanf
更简单,如果扫描失败,您只需忘记输入字符串并得到另一个即可。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a, b;
char str[42];
do {
printf("Enter 2 numeric values\n");
if(fgets(str, sizeof str, stdin) == NULL) {
exit(1);
}
} while(sscanf(str, "%d%d", &a, &b) != 2);
printf("Numbers are %d and %d\n", a, b);
}
计划会议:
Enter 2 numeric values cat dog Enter 2 numeric values cat 43 Enter 2 numeric values 42 dog Enter 2 numeric values 42 43 Numbers are 42 and 43
请注意,goto
在C语言中是较差的做法,应仅在没有其他构造代码的方式(通常是这种方式)的情况下使用。
答案 1 :(得分:1)
scanf()
返回不同于2
的值有多种原因:
A
待处理,则%d
转换将失败,并且A
会保留在输入流中。您的代码只会继续尝试此转换,并且永远不会停止。重试之前,您应该阅读并丢弃有问题的输入。EOF
。如果返回EOF
,则没有任何必要再次尝试,因为没有更多输入可用。goto
和while
等流控制语句更好地表示的结构,使用for
被认为是不好的风格。这是更正的版本:
#include <stdio.h>
// program to detect whether only integer has been given or not
int main() {
int a, b, s, c;
printf("Enter two proper numbers: ");
for (;;) {
s = scanf("%d%d", &a, &b); //storing the scanf return value in s
if (s == 2) // conversions successful
break;
if (s == EOF) {
printf("unexpected end of file\n");
return 1;
}
/* discard the rest of the input line */
while ((c = getchar()) != EOF && c != '\n')
continue;
printf("Invalid input. Try again: ");
}
printf("The values are %d and %d\n", a, b);
return 0;
}
答案 2 :(得分:0)
scanf返回字符数。结果,s
将等于您写入的字符数为2,然后您的 loop 将停止。无限次运行的原因是您输入的字符数与2不同。请打印s以查看其拥有什么值,您将获得更多信息。