【问题标题】:What happens when %d format specifer is used in scanf to read a character from keyboard?在 scanf 中使用 %d 格式说明符从键盘读取字符时会发生什么?
【发布时间】:2020-07-26 00:08:01
【问题描述】:

我是 C 编程语言的新手,我正在尝试学习一些简单的 sn-ps 的行为,如下所述:

#include<stdio.h>
int main()
{
    int number;
    printf("Enter a number:");
    scanf("%d",&number);
    printf("The entered number is:%d",number);
    return 0;
}

当 scanf() 函数从键盘读取十进制数字时,上面的代码可以正常工作。但是,当我故意输入字母时,输出为 0,当我输入任何其他字符时,输出为 53。有人可以解释为什么会这样吗?

【问题讨论】:

  • 不仅要看number,还要看scanf的返回值。

标签: c io character scanf format-specifiers


【解决方案1】:

%d 字符表示它需要一个十进制数,注意这不是一个浮点数,而是一个整数。如果您想在其中放置字符,请使用 %c。

【讨论】:

    【解决方案2】:

    %d 表示任意数量的十进制数字 (0-9)。对于奇怪的行为,您需要检查 scanf 函数的返回值

    这是来自 scanf 的确切文档摘录

    成功时,函数返回参数的项目数 列表成功填写。这个计数可以匹配预期的数量 由于匹配失败,项目或更少(甚至为零),读数 错误,或到达文件末尾。

    如果发生读取错误或到达文件结尾同时 阅读时,设置了正确的指标(feof 或 ferror)。而且,如果有的话 在成功读取任何数据之前发生,返回 EOF。

    如果在解释宽字符时发生编码错误, 函数将 errno 设置为 EILSEQ。

    所以,你需要检查scanf函数的返回值,看看scanf是否已经成功填满了所有需要的项。

    这里有一段代码可以做这样的错误检查

    #include<stdio.h>
    int main()
    {
        int number;
        int ret;
        printf("Enter a number:");
        ret = scanf("%d",&number);
        if(ret == 1){ // number of expected items to be filled; in your case 1
            printf("The entered number is:%d\n",number);         
        }else{
           printf("Invalid Input\n");
        }
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      "scanf() 中使用%d 格式说明符从键盘读取字符时会发生什么?"

      实际的 C 标准 (C18),第 7.21.6.2/10 节 - “fscanf 函数”指出:

      "如果输入项不是匹配序列,则指令执行失败:此条件为匹配失败。"

      因此,在您提供的情况下,指令的执行将失败,因为您输入了一个字符,并且不应从该特定的scanf() 调用将任何值写入number

      始终检查 scanf() 的返回值,该值指示成功分配了多少输入项,否则如果在第一次转换完成之前发生输入失败,则为 EOF


      “但是,当我故意输入字母时,我得到的输出是 0,而当我输入任何其他字符时,我得到的输出是 53。有人可以解释一下为什么会这样吗?” p>

      它打印出任意数字的原因是因为你没有用任何值初始化number

      int number;
      

      由于number默认是存储类auto的对象,它包含一个随机垃圾值,然后由printf()打印。它与scanf() 调用无关。

      因此,如果您要在 number 的定义中使用有效值(如 f.e.)初始化int number = 24;我很确定当输入字符时程序的输出将是24

      【讨论】:

        猜你喜欢
        • 2013-09-29
        • 2013-05-19
        • 2013-05-27
        • 2020-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多