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

时间:2018-01-16 23:34:57

标签: c scanf language-lawyer

以下程序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);
}

根据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)之前检查用户输入对我来说都是荒谬的。

1 个答案:

答案 0 :(得分:6)

未定义。见one section up:

  

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