这就是我的程序: 该程序扫描并打印数字,但如果输入字符,我希望它打印“错误”。如果我把“a”之类的东西放进去,它会产生无限循环。为什么?
#include <stdio.h>
int main(void){
printf("Enter a number: \n");
int a;
while(scanf("%d",&a)!=EOF){
if(46<'a'<58){
}
else{
printf("Mistake.");
return -1;
}
printf("%d\n",a);
}
}
答案 0 :(得分:1)
首先,你不能链接 C中的关系运算符。你需要改变
if(46<'a'<58){
到
if ((46 < 'a') && ( 'a' < 58 )) {
让它发挥作用。
也就是说,char
值与%d
格式说明符不匹配。你需要
%c
将输入扫描为char
并检查ASCII值%d
扫描int
输入,并检查scanf()
的返回值是否成功。此外,如果scanf()
对于非int
值失败,则需要在再次循环之前清理输入缓冲区以避免无限循环。答案 1 :(得分:1)
将输入作为带fgets()
的字符串读取,然后根据需要进行测试。
使用scanf("%d", ...)
失败时返回0,1或EOF
,会检测到int
或文件结尾。代码可以测试返回值,但强大的代码简单不使用scanf()
。
char buf[100];
while(fgets(buf, sizeof buf, stdin) != NULL) {
int a;
if (sscanf(buf, "%d",&a) == 1) {
printf("%d\n",a);
} else {
puts("Mistake.");
}
}
if(46<'a'<58)
不起作用。它首先比较46<'a'
1
:true,然后比较1 < 58
,这也是真的。 @124...
答案 2 :(得分:0)
46 < 'a' < 58
始终为真,因为46 < 'a'
评估为1
,然后1 < 58
评估为1
。另外我想你想要a
,而不是'a'
,这实际上是一个文字。另外,我认为你的代码存在一些逻辑问题。
以下是精炼代码:
#include <stdio.h>
int main(void){
puts("Enter a number:");
char a;
while(scanf("%c", &a) != EOF) {
if(('0' <= a && a <= '9') || a == '\n'){
putchar(a);
}
else
{
puts("Mistake.");
return -1;
}
}
}