给出%hhu和输入1025,哪个部分映射到unsigned char?

Ste*_*ner 3 c scanf language-lawyer

在下列PROGRAMM的输出10,或者是不确定的行为?

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);
}
Run Code Online (Sandbox Code Playgroud)

根据带有长度修饰符(即)的fscanf 转换说明符 ,语义是基于函数的定义和映射到无符号字符的类型指针:%u hh%hhustrtoul

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

"u" 匹配一个可选的带符号十进制整数,其格式与strtoul函数的主题序列的预期格式相同,基本参数的值为10.相应的参数应该是指向无符号整数的指针.

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

"hh"指定以下d,i,o,u,x,X或n转换说明符适用于带有signed char或unsigned char的类型指针的参数.

但是如果输入序列表示超过8位的整数值,那么会发生什么呢?整数值的哪一部分映射到无符号字符的8位?是否定义它必须是最不重要的部分,它是否依赖于endianess,它是未指定的,还是甚至产生未定义的行为?

我无法相信它是未定义或未指定的行为.这意味着用户输入可能会在程序中引入此类行为scanf("%hhu",&u),并在每次使用scanf看起来荒谬之前检查用户输入.

use*_*ica 6

未定义.见上一节:

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

  • @melpomene:我认为"转换"这个词的使用方式不同.是的,值"1025"到"unsigned char"的类型转换产生"1"(假设,例如,`CHAR_BIT == 8`).但这里讨论的"转换"是从输入项(字符序列)到目标类型.转换(字符串"1025"到整数)的结果是1025,它不能用`unsigned char`对象表示. (2认同)
  • @melpomene:我同意这里有一些含糊不清和不足之处,但我认为结论是正确的.没有语言可以建议首先通过从字符序列转换为任意精度整数来进行转换,然后就像通过整数类型的转换一样.建议(但没有明确说明)转换就像`strtol`-family函数(所有类型都不存在)一样; 在这种情况下,越界值会产生错误,而不是包装. (2认同)