【问题标题】:C++ display char while loop rowsC++ 显示 char while 循环行
【发布时间】:2012-02-22 23:39:42
【问题描述】:

我对编程很陌生,所以如果这个问题看起来简单得离谱,我深表歉意。我正在研究我的 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字符之后吐出一些垃圾,我不知道为什么。更奇怪的是,如果我使用 while 循环将代码中的变量“字母”更改为 int 而不是 char,它会完全按照我想要的方式运行并在应该时终止,只显示实际数字而不是 ASCII价值观。

只有当“字母”是一个字符时,我才会得到一个无限循环。我敢肯定这真的很简单,我现在可能太累了,看不到它,但任何帮助/提示将不胜感激!尽管我在技术上得到了答案,但我不知道为什么第二个答案如此糟糕地失败了,这让我发疯了。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    答案很简单,很真实。这是发生的事情 - (signed)char 在将行输出到 112 后,内部循环中的值可以在 [-128, 127] 范围内,您将 count 增加另一个 16,因此您还可以将 letter 增加 16,这使 letter 等于 112 + 16 = 128,由于有符号字符的范围实际上溢出并变为 -128。因此,在内循环执行之后,外循环的条件仍然成立:-128

    如何解决问题?更改内部循环中的检查: while (count &lt; 16 &amp;&amp; letter &lt; 127)

    【讨论】:

    • 啊,这很有道理。谢谢!
    【解决方案2】:

    当 letter == 48, 64, ..., 128 时,内部 while 循环退出。但由于它是一个(带符号的)字符,128 被解释为 -128,外部循环不会终止。 将内部循环更改为

    while (count < 16 && letter < 127)
    

    获得与第一个示例相同的行为。

    或者把letter改成int,如果可以打印包括127在内的所有字符:

    int letter = 32;
    ...
    cout << (char)letter << " ";
    

    【讨论】:

      【解决方案3】:

      试试这个代码:

      #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 << ' ';
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-10-15
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 2016-11-19
        • 2015-11-05
        • 1970-01-01
        相关资源
        最近更新 更多