C - 给定一个 %hhu 和一个输入 1025,哪个部分映射到无符号字符?



以下程序的输出是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转换说明符%u长度修饰符hh(即%hhu),语义是基于strtoul函数和指向无符号字符的类型指针的映射定义的:

12) 转换说明符及其含义是:

"u">匹配格式相同的可选有符号十进制整数 正如预期的那样,对于 strtoul 函数的主题序列,具有 基参数的值 10。相应的参数应为 指向无符号整数的指针。

11) 长度修饰符及其 含义是:

"hh">指定以下 d, i, o, u, x, X 或 n 转换说明符适用于带有类型指针的参数 到有符号的字符或无符号的字符。

但是,如果输入序列表示超过 8 位的整数值,并且整数值的哪一部分映射到无符号字符的 8 位,会发生什么情况?它是否被定义为它必须是最不重要的部分,它是否取决于恩迪亚性,它是否未指定,或者它甚至产生未定义的行为?

我不敢相信这是未定义或未指定的行为。这意味着用户输入可能会在使用scanf("%hhu",&u)的程序中引入这种行为,并且在每次使用scanf之前检查用户输入对我来说看起来很荒谬。

未定义。请参阅向上的一个部分:

10 除 % 说明符的情况

外,输入项(或 %n 指令的输入字符计数)将转换为适合于转换说明符的类型。如果输入项不是匹配序列,则指令的执行失败:此条件是匹配失败。除非赋值抑制由 * 指示,否则转换结果将放置在尚未收到转换结果的格式参数后面的第一个参数所指向的对象中。如果此对象没有适当的类型,或者转换的结果无法在对象中表示,则行为未定义

最新更新