尝试打印所有 ASCII 值时无限循环
Infinite Loop when trying to print all the ASCII values
当我尝试打印所有 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;
}
你的 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
:
a plain char
object can take on either the same values as a signed char
or an unsigned char
; which one is implementation-defined.
你的问题是 char
数据类型的范围是 -128 到 127。这也意味着当你到达 a = 127
然后 a++
,它循环回到a = -128
然后继续。因此,当您查看 a <= 127
的条件时,它将始终为真。一种选择可能是制作无符号类型
char是赋值符号,
所以 a + 128 = a
这意味着当 a == 127 时,a++ 给你 128 -> a = 0 所以条件仍然为真
你可以用=修复它
如果 (a >= 127) 中断;
或使用 do {} while (a != 127)
当我尝试打印所有 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;
}
你的 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
:
a plain
char
object can take on either the same values as asigned char
or anunsigned char
; which one is implementation-defined.
你的问题是 char
数据类型的范围是 -128 到 127。这也意味着当你到达 a = 127
然后 a++
,它循环回到a = -128
然后继续。因此,当您查看 a <= 127
的条件时,它将始终为真。一种选择可能是制作无符号类型
char是赋值符号, 所以 a + 128 = a
这意味着当 a == 127 时,a++ 给你 128 -> a = 0 所以条件仍然为真
你可以用=修复它 如果 (a >= 127) 中断;
或使用 do {} while (a != 127)