【问题标题】:Printing ASCII in C在 C 中打印 ASCII
【发布时间】:2014-01-10 05:18:57
【问题描述】:

我正在尝试编写一个程序,该程序将使用 for 循环打印出所有 ASCII 字符,但它一直在无限循环,除非我取出 127,我做错了什么还是 ASCII 的行为方式?

这会崩溃(无限循环):

#include <stdio.h>

int main (void)
{

for (char i = -128; i <= 127; i++)
{
    printf("%d = %c\n", i, i);
}

return 0;
}

但这很好:

#include <stdio.h>

int main (void)
{

for (char i = -128; i < 127; i++)
{
    printf("%d = %c\n", i, i);
}

printf("%d = %c\n", 127, 127);

return 0;
}

【问题讨论】:

  • 如果i 是有符号的8 位char 类型,i &lt;= 127 始终为真。
  • 从0循环而不是-127,没有负值ASCII字符
  • Twos Complement 浮现在脑海中。
  • 您使用的是什么编译器版本,您启用了哪些警告?理想情况下,会有一个编译器警告i &lt;= 127 始终为真,您应该调查此类警告是否存在代码中可能存在的错误。
  • 请注意,“崩溃”与“无限循环”不同。在第一种情况下,您的程序异常终止。在第二种情况下,只要您允许,您的程序就会继续愉快地运行。

标签: c for-loop ascii


【解决方案1】:

当循环到达127时,允许继续。然后,127 加 1。因为这是signed char,所以它换行到-128,仍然满足循环条件。其实signed char的每一个值都小于等于127

更正常的做法是为循环使用更大的数据类型,例如 int

for (int i = 0; i < 256; i++) {
    printf("%d = %c\n", i, i);
}

【讨论】:

    【解决方案2】:

    因为有符号字符永远不能大于127...

     #include <stdio.h>
    
    int main (void) {
        printf("%d = %c\n", (char) 128, (char) 128);
        printf("%d = %c\n", (char) -128, (char) -128);
    }
    

    输出

    -128 = �
    -128 = �
    

    【讨论】:

      猜你喜欢
      • 2022-08-23
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多