以下程序1
或0
的输出,还是未定义的行为?
int main() {
unsigned char u = 10;
sscanf("1025","%hhu",&u);
printf("u, is it 0 or is it 1? u's value is ... %hhu", u);
}
根据fscanf
conversion specifier %u
length modifier hh
(即%hhu
),语义是根据{{1}定义的函数和映射到无符号字符的类型指针:
12)转换说明符及其含义为:
的 “u” 匹配可选的带符号十进制整数,其格式相同 正如预期的strtoul函数的主题序列 基本参数的值为10。相应的论点应为a 指向无符号整数的指针。
11)长度修饰符及其值 意思是:
“hh”指定以下d,i,o,u,x, X或n转换说明符适用于带有类型指针的参数 签名char或unsigned char。
但是如果输入序列表示超过8位的整数值,那么会发生什么呢?积分值的哪一部分映射到无符号字符的8位?是否定义它必须是最不重要的部分,它是否依赖于endianess,是否未指定,还是甚至产生未定义的行为?
我无法相信它是未定义或未指定的行为。这意味着用户输入可能会在使用strtoul
的程序中引入此类行为,并且在每次使用scanf("%hhu",&u)
之前检查用户输入对我来说都是荒谬的。
答案 0 :(得分:6)
未定义。见one section up:
10除了%说明符的情况外,输入项(或者,在%n指令的情况下,输入字符的数量)将转换为适合转换说明符的类型。如果输入项不是匹配序列,则指令的执行失败:此条件是匹配失败。除非通过*指示赋值抑制,否则转换的结果将放在由尚未收到转换结果的format参数后面的第一个参数指向的对象中。如果此对象没有合适的类型,或者如果转换结果无法在对象中表示,则行为未定义。