【问题标题】:Why does %c print '?' and what is its meaning为什么 %c 打印 '?'它的含义是什么
【发布时间】:2019-07-13 14:06:06
【问题描述】:

两个例子

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

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

返回

?
?

【问题讨论】:

  • 这不太可能是真正的? 字符。更有可能是您的终端无法显示字符,或者如果您使用的是图形终端,则当前字体中不存在该特定字符。
  • 发布printf("\n %d" , ((unsigned char)a[i]+100); 的结果会有所帮助。
  • @chux 请原谅我,如果我问的是一些基本的问题,但%d(unsigned char) 不会错吗?不应该是%u吗?我总是难以理解默认的 arg 提升。
  • @AjayBrahmakshatriya 是的,"%u" 会更好。 UCHAR_MAX <= INT_MAX 没有区别。
  • @chux,但如果我理解正确,unsigned int 的位表示将被传递,它将被重新解释为int。标准是否允许它们具有不同的表示形式?

标签: c char printf format-string


【解决方案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.1 8

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

当然,在 OP 的平台上,对于许多超出 ASCII 范围的字符,输出默认为 ?@paddy

【讨论】:

    【解决方案2】:

    您在两个语句中都缺少一个结束 "。您使用的是什么编译器?如果您使用带有 -Wall 编译器标志的 gcc 进行编译,您会看到:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • "只有 0-127 的字符对 %c 有效 ..." --> 不同意。作为int 传递的任何0 或正值都可以——>“int 参数转换为unsigned char,并写入结果字符。” printf("\n %c , 'X' + 256);printf("\n %c , 255); 很好。
      【解决方案4】:

      你猜对了,c 返回一个字符。这意味着在%c 中,一个字符在打印字符串中的那个位置被替换。

      【讨论】:

        猜你喜欢
        • 2013-05-10
        • 1970-01-01
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多