问题描述
我正在编写此代码:
int b;
char c;
scanf("%d",&b);
while((c = getchar()) != EOF) {
if(c >= 9 || c < 0) {
printf("Invalid number!\n");
exit(0);
}
}
当我分配 b
时,c
自动等于 b
。
例如,如果我对 b
的输入是 10
,它会自动进入 if
语句并退出代码。
有人知道为什么吗?
解决方法
发现问题并解决问题
您在下面列出的代码中有很多错误。
-
getchar(3)
说:getchar()
等价于getc(stdin)
。getc()
的原型是:int getc(FILE *stream);
也就是说,
getchar()
返回一个整数(来自unsigned char
转换)。因此,我们需要将类型从char
更改为int
以正确接受其返回值。请注意,
EOF
不是有效的unsigned char
。它扩展为signed int
-1。 -
永远不要忽略
scanf(3)
的返回值。它返回正确传递的参数的数量。在这种情况下,为了使代码可靠,我们应该:if (scanf("%d",&b) != 1) { fprintf(stderr,"Value must be an integer.\n"); return EXIT_FAILURE; }
-
条件中有语义错误:
if (c >= 9 || c < 0) ^^____________ logically,9 is a valid one digit number so removing '=' from here makes more sense
一个值得注意的事情是比较器的条件和类型——两者都应该改变。请参阅下一步。
-
固定循环应如下所示:
while ((c = getchar()) != EOF) { if (c == '\n') // Since c = getchar() can be '\n' too continue; // so,better ignore if (c >= '0' && c <= '9') // Change the loop like this printf("Valid number %d %c.\n",c,c); else printf("Invalid number.\n"); }
示例测试用例输出
1
10 // --- Note: 10 are two chars for two getchars
Valid number 49 1.
Valid number 48 0.
3
Valid number 51 3.
9
Valid number 57 9.
-
Invalid number.
a
Invalid number.
<
Invalid number.
.
Invalid number.