我对编程很新,所以如果这个问题看起来很荒谬,我会道歉。我正在编写C ++新书的当前章节中的一些额外问题。我实际上找到了问题的正确答案,但是在这样做的时候,我遇到了让我疯狂的情况,因为我无法弄清楚为什么一个特定的解决方案有效而另一个没有。
因此,问题要求在几行中打印32到127之间的ASCII值,每行16个字符。我所遇到的解决方案(正常工作)是这样的:
#include <iostream>
using namespace std;
int main()
{
char letter;
int count = 0;
for (letter = 32; letter < 127; letter++, count++)
{
if (count == 16)
{
cout << endl;
count = 0;
}
cout << letter << " ";
}
cout << endl;
return 0;
}
同样,上面的代码运行正常并按我的意愿行事。困难在于我在此之前尝试过的事情。我尝试使用嵌套的while循环执行相同的问题,如下所示:
#include <iostream>
using namespace std;
int main()
{
char letter = 32;
int count;
while (letter < 127)
{
count = 0;
while (count < 16)
{
cout << letter << " ";
letter++;
count++;
}
cout << endl;
}
cout << endl;
return 0;
}
这个while循环只是无限运行,并在我想要的ASCII字符后吐出一些垃圾,我无法弄清楚原因。更奇怪的是,如果我将代码中的变量'letter'用while循环更改为int而不是char,它会按照我想要的方式运行并在应该的时候终止,只显示实际的数字而不是ASCII值。
只有当'letter'是一个char时,才能获得无限循环。我确信这是非常简单的事情,我可能只是太累了现在看不到它,但任何帮助/提示都会非常感激!虽然我在技术上得到了答案,但这让我发疯,我不知道为什么第二个答案失败如此可怕。
提前致谢。
答案 0 :(得分:4)
答案很简单,足够真实。这是发生的事情 - (签名)char在输出行到112之后,内部循环中的值可以在[-128,127]范围内,你用另一个16递增计数,因此你也用16增加字母,这使字母等于112 + 16 = 128,由于有符号字符的范围实际上溢出并变为-128。因此,在执行内循环之后,外循环的条件仍然成立:-128&lt;这就是为什么你会得到奇怪的字符 - 这些字符将是-128到32之间的值。
如何解决问题?更改内循环中的检查:
while (count < 16 && letter < 127)
答案 1 :(得分:1)
当字母== 48,64,...,128时内部while循环退出。但由于它是(带符号)char,128被解释为-128,外部循环不会终止。 将内循环更改为
while (count < 16 && letter < 127)
获得与第一个示例中相同的行为。
或者将字母更改为int,如果可以打印所有字符,包括127:
int letter = 32;
...
cout << (char)letter << " ";
答案 2 :(得分:0)
试试这段代码:
#include <iostream>
using namespace std;
int main()
{
int letter;
for (letter = 32; letter < 128; ++letter)
{
if (letter != 32 && letter % 16 == 0)
cout << endl;
cout << (char)letter << ' ';
}
}