Ste*_*ner 3 c scanf language-lawyer
在下列PROGRAMM的输出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);
}
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看起来荒谬之前检查用户输入.
未定义.见上一节:
10除了%说明符之外,输入项(或者,在%n指令的情况下,输入字符的数量)将转换为适合转换说明符的类型.如果输入项不是匹配序列,则指令的执行失败:此条件是匹配失败.除非通过*指示赋值抑制,否则转换的结果将放在由尚未收到转换结果的format参数后面的第一个参数指向的对象中.如果此对象没有适当的类型,或者无法在对象中表示转换结果,则行为未定义.
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |