【问题标题】:Why does printf( "%c", 1) return smiley face instead of coded char for 1为什么 printf("%c", 1) 返回笑脸而不是 1 的编码字符
【发布时间】:2016-09-24 02:45:48
【问题描述】:

这是我的代码

#include <stdio.h>

int x,y;

int main( void )
{
    for ( x = 0; x < 10; x++, printf( "\n" ) )
        for ( y = 0; y < 10; y++ )
            printf( "%c", 1 );

    return 0;
}

它返回笑脸。我到处搜索笑脸代码或 1 代码,但我没有找到任何链接或任何解释为什么 1 的 char 值返回笑脸,当 1 的 ascii 代码是 SOH 时。我研究了这个问题的答案,但没有找到任何答案来解释为什么会发生这种情况。

【问题讨论】:

  • 您需要注意您正在运行的终端信息。如果您认为这不重要,请三思。
  • 我没有得到这个代码的笑脸...
  • @malkat google“终端代码页”
  • @WeatherVane 谢谢!我正在努力寻找连接,但能够通过在 cmd 中键入 chcp 来发现我正在使用第 437 页。现在我明白了为什么我通过输入不同的数字得到了我得到的字符。
  • '%c' 期待单个字符,但是,1 是一个多字符整数。建议使用:printf( "%d", 1 );

标签: c terminal character-encoding printf character


【解决方案1】:

输出因终端而异。例如,在我的 OS X 默认终端上,不输出任何字符。

在您的情况下, 的输出可能是由于some historical reasons。简而言之,这是因为将字节0x01 映射到U+263A 的代码页437 是MS-DOS 的字符集。

【讨论】:

  • 谢谢!我必须在 cmd 中搜索活动代码页才能找到我的 Windows 控制台使用的字符图(第 437 页)
【解决方案2】:

因为1 不是可打印的字符代码。如果你想要'1',你需要用字符文字来写:

 printf( "%c", '1' );
            // ^^^

【讨论】:

  • @GauravSehgal 好吧,正如我提到的,它不是可打印的字符。
  • 是的,没错,但他为什么要笑脸?
  • @GauravSehgal 这取决于终端以及不可打印字符的表示方式。
  • 更不用说笑脸是比段错误更好的东西:)
  • @cHao 非常感谢您的回答!我在哪里可以获得 Windows 的 OEM 列表?例如,即使我输入 2,它也会显示笑脸,但如果我输入 65,它会打印 A(就像我想的那样)。
【解决方案3】:

如果您使用数字,您将从 ASCII 表中选择一个字符编号,如果您使用 char,您将找到该字符。

示例:此代码打印 ASCII 字符号 65:

printf( "%c", 65 ); // Outputs: A

此代码打印字母 A:

printf( "%c", 'A' ); // Outputs: A

【讨论】:

  • 没有输出A,是个错误。
  • printf( "%c", 65 ); // Outputs: A - not on my mainframe terminal。孩子们,这就是幻数编程是一个坏主意的众多原因之一。
  • 这是一个例子
  • @maltkat:65 在这里是一个神奇的数字。如果您发现这样的代码没有任何注释,则不清楚65 的用途是什么,因为它会在不同的平台上给出不同的结果。正如 WhozCraig 所提到的,除了 ASCII 之外,还有其他字符集正在使用中。
  • 不一定正确,例如,如果底层字符集是 EBCDIC,那么输出的内容将与使用 ASCII 字符集的输出完全不同。并且当前选择了哪个code page也会导致不同的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多