【问题标题】:Input, Output C Program输入、输出 C 程序
【发布时间】:2016-03-29 14:13:17
【问题描述】:

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

【问题讨论】:

  • 我认为你最好扫描每个字符而不是每个整数。
  • 46
  • "如果输入了一个字符,我希望它打印“错误”" -- scanf( "%d", ... ) 如果输入了一个字符,将会失败,因为一个字符与输入不匹配为"%d"。你甚至不会进入循环。

标签: c printf scanf


【解决方案1】:

首先,你不能链接 C 中的关系运算符。你需要改变

 if(46<'a'<58){

if ((46 < 'a')  && ( 'a' < 58 )) {

让它工作。

也就是说,char 值与 %d 格式说明符不匹配。你需要

  • 使用%c将输入扫描为char并检查ASCII值
  • 使用%d 扫描int 输入并检查scanf() 的返回值是否成功。此外,如果scanf() 因非int 值而失败,则需要在再次循环之前清理输入缓冲区以避免无限循环。

【讨论】:

    【解决方案2】:

    使用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&lt;'a'&lt;58) 不起作用。它首先比较46&lt;'a',即1:true,然后比较1 &lt; 58,这也是真的。 @124...

    【讨论】:

      【解决方案3】:

      46 &lt; 'a' &lt; 58 始终为真,因为46 &lt; 'a' 的计算结果为1,然后1 &lt; 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;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-05-09
        • 2019-07-03
        • 1970-01-01
        • 2015-12-04
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        相关资源
        最近更新 更多