-1

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

#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。有人可以解释为什么会这样吗?

4

3 回答 3

1

%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;
}
于 2020-04-13T12:33:10.663 回答
0

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

于 2020-04-13T12:24:25.837 回答
0

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

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

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

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

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


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

它打印出任意数字的原因是因为您没有number使用任何值进行初始化:

int number;

由于默认情况下number是存储类的对象auto,因此它包含一个随机垃圾值,然后由printf(). scanf()它与呼叫无关。

因此,如果您number在其定义中使用有效值(如 fe)进行初始化,int number = 24;我很确定程序的输出将是24输入字符时。

于 2020-04-13T12:45:40.467 回答