输入,输出C程序

时间:2016-03-29 14:13:17

标签: c printf scanf

这就是我的程序: 该程序扫描并打印数字,但如果输入字符,我希望它打印“错误”。如果我把“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);
    }
}

3 个答案:

答案 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;
        }
    }
}
相关问题