簡體   English   中英

C ++在循環行中顯示char

[英]C++ display char while loop rows

我對編程非常陌生,因此對於這個問題似乎很簡單,我深表歉意。 我正在C ++書籍的當前章節中處理一些其他問題。 實際上,我已經找到了解決該問題的正確答案,但是在這樣做的過程中,我遇到了一種使我發瘋的情況,因為我無法弄清楚為什么一個特定的解決方案有效而另一個解決方案無效。

因此,該問題要求在幾行中以每行16個字符打印32到127之間的ASCII值。 我來到的解決方案(正常工作)是這樣的:

#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價值觀。

只有當“字母”是一個字符時,我才會陷入無限循環。 我敢肯定這確實很簡單,可能現在我太累了而看不到它,但是任何幫助/提示都將不勝感激! 即使我從技術上得到了答案,也讓我發瘋,我不知道為什么第二個答案如此可怕地失敗了。

提前致謝。

答案很簡單,足夠真實。 這就是發生的情況-輸出行數最多為112后,(帶符號的)char在內部循環中的值可以在[-128,127]范圍內,將count增加另一個16,因此也將letter增加16。使字母等於112 + 16 = 128,由於帶符號的char的范圍實際上溢出,並且變為-128。 因此,在執行了內循環之后,外循環的條件仍然成立:-128 <127。這也是為什么您得到奇怪字符的原因-這些值將是-128和32之間的值。

如何解決問題? 更改內部循環中的支票: while (count < 16 && letter < 127)

當字母== 48、64,...,128時,內部while循環退出。但是由於它是一個(帶符號的)字符,因此128被解釋為-128,並且外部循環不會終止。 將內部循環更改為

while (count < 16 && letter < 127)

獲得與第一個示例相同的行為。

或將letter更改為int,如果可以打印包括127的所有字符,則可以:

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

試試這個代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM