【问题标题】:Infinite Loop when trying to print all the ASCII values尝试打印所有 ASCII 值时的无限循环
【发布时间】:2020-02-10 02:03:29
【问题描述】:

当我尝试打印所有 128 个 ASCII 值时,我似乎陷入了无限循环,但我不明白为什么。该问题要求我编写一个程序,该程序使用循环来显示 ASCII 代码 0 到 127 的字符,并在每行显示 16 个字符。我尝试使用 for 循环并告诉程序如果我的 char 变量超过 127 则停止循环,但由于某种原因,我最终得到了一个无限循环。我什至写了一个 if 语句,告诉循环在 char 变量超过 127 时中断,但这似乎也不起作用。这是我的代码,任何反馈将不胜感激,谢谢。

#include <iostream>
using namespace std;

int main() {
    char a;

    for (char a = 0; a <= 127; a++)
    {
        cout << a << " ";
        if (a % 16 == 0)
            cout << endl;
        if (a > 127)
            break;
    }
    return 0;
}

【问题讨论】:

  • 没关系,但实际上你有 两个 a 变量,for 语句中的一个会影响另一个。您可能也不想真正打印0..31127,它们在ASCII 中是不可打印的。

标签: loops ascii infinite


【解决方案1】:

您的 char 类型几乎可以肯定是有符号的(C/C++ 允许 char 有符号或无符号 (a))所以,当您将一个添加到 127 时,它是环绕到-128(实际上不是标准强制,而是常见的行为)。

因此它总是小于或等于127

您可以使用以下代码进行测试:

#include <iostream>
using namespace std;

int main() {
    char x = 127;
    x++;
    cout << (int)x << endl;
    return 0;
}

如果是这种情况,请使用unsigned char 而不是char


这里有一些代码可以完成这项工作,同时也只打印出特别标记为可打印的字符:

#include <iostream>
using namespace std;

int main() {
    unsigned char a = 0;
    while (a < 128) {
        if (isprint(a)) {
            cout << a << " ";
        } else {
            cout << ". ";
        }
        if (++a % 16 == 0) {
            cout << endl;
        }
    }
    return 0;
}

结果是:

. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
  ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~ .

(a) 来自C++ 17, basic.fundamental

普通的char 对象可以采用与signed charunsigned char 相同的值;哪一个是实现定义的。

【讨论】:

    【解决方案2】:

    char 是带符号的符号, 所以 a + 128 = a

    这意味着当 a == 127 时,a++ 给你 128 -> a = 0 所以条件仍然为真

    你可以用 = 修复它 if (a >= 127) 中断;

    或使用 do {} while (a != 127)

    【讨论】:

      【解决方案3】:

      您的问题是 char 数据类型的范围从 -128 到 127。这也意味着当您到达 a = 127 然后到达 a++ 时,它会循环回到 a = -128 然后继续。因此,当您查看a &lt;= 127 的情况时,它始终是正确的。一种选择可能是制作无符号类型

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 2020-05-04
        • 1970-01-01
        • 2022-11-20
        • 2016-08-28
        • 2017-03-19
        相关资源
        最近更新 更多