C ++在循环行中显示char

时间:2012-01-31 08:18:05

标签: c++ loops for-loop while-loop infinite

我对编程很新,所以如果这个问题看起来很荒谬,我会道歉。我正在编写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时,才能获得无限循环。我确信这是非常简单的事情,我可能只是太累了现在看不到它,但任何帮助/提示都会非常感激!虽然我在技术上得到了答案,但这让我发疯,我不知道为什么第二个答案失败如此可怕。

提前致谢。

3 个答案:

答案 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 << ' ';
  }
}