为什么%c打印'?'它是什么意思

时间:2019-02-20 00:20:55

标签: c char printf format-string

两个例子

printf("\n %c , ((unsigned char)a[i]+100);

printf("\n %c , -11);

返回

?
?

4 个答案:

答案 0 :(得分:2)

两个语句中都缺少结尾处的“。正在使用什么编译器?如果使用带有-Wall编译器标志的gcc进行编译,则会看到:

warning: missing terminating " character
     printf("\n %c , ((unsigned char)a[i]+100);

答案 1 :(得分:2)

字符-11不是有效的7位ASCII字符。这也是一个无效的UTF-8字节,因此为?结果。

只有字符0-127对%c有效。其他所有内容都将成为多字节UTF-8字符的一部分,或者取决于字符集。

答案 2 :(得分:1)

"%c"期望有int

(unsigned char)a[i]+100(unsigned char) + (int)。当(unsigned char)为8位(最常见)时,将产生int。因此,在下面的两个代码中,代码都将int传递给printf()

printf("\n %c , ((unsigned char)a[i]+100);
printf("\n %c , -11);

"%c"将该int转换为unsigned char

  

c ... int参数被转换为   unsigned char,并写入结果字符。 C11dr§7.21.6.18

假设8位unsigned char,则转换后的值在0到255的范围内。-11变为245。然后写入字符。对于ASCII范围为0-127的值,我们通常会看到ASCII字符或控制字符的效果。其他值将打印其他内容。

某些OP平台上的某些超出ASCII范围的字符的输出默认为?@paddy

答案 3 :(得分:0)

您猜对了,c返回一个字符。这意味着在%c中,在打印字符串中该位置处替换了一个字符。