I learned today C中的scanf()不判断整数是否可在指定类型中表示.例如:

#include <stdio.h>

int main(void)
{
    short num;
    int ret = scanf("%hd", &num);
    printf("read %d, returned %d\n", num, ret);
    return 0;
}

在我的系统(Clang/MacOS)上,上面的程序将显示"返回1",意思是scanf()读取指定的令牌,即使输入不可表示,例如4223215425243525443245234453.man scanf说:

当输入字符与此类格式字符不匹配时,扫描停止.当无法进行输入转换时,扫描也会停止.

Does the C standard require this behavior,或者是否也允许scanf()的实现者将超出范围的数字输入视为无效(因此在类似上面的情况下返回0)?如果这种行为是必需的,我希望引用标准中的话来说明.

推荐答案

如果此对象没有适当的类型,或者如果转换结果无法在该对象中表示,则行为为undefined.

因此,任何事情都是绝对允许的.

C++相关问答推荐

带双指针的2D数组

Apple Libm的罪恶功能

从C函数调用asm函数时生成错误的BLX指令(STM32H753上的gcc)

为什么写入系统调用打印的字符数不正确?

VS代码C/C++扩展intellisense无法检测环境特定函数'

GCC预处理宏和#杂注GCC展开

如何在IF语句中正确使用0.0

如何在C宏中确定 struct 中元素的类型?

Can函数指针指向C++中具有不同参数连续性的函数

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

初始变量重置后,char[]的赋值将消失

错误:包含文件时类型名称未知

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

如何读取程序中嵌入的数据S自己的ELF?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

Linux/C:带有子进程的进程在添加waitid后都挂起

C中的空指针是什么(_N)?

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

使用替代日历打印日期

如何转义包含指令中的字符?