2012-01-31 84 views
1

我對編程非常陌生,所以我很抱歉如果這個問題看起來很荒唐簡單。我正在研究C++本書當前章節中的一些額外問題。實際上,我發現問題的答案是正確的,但是在這樣做的過程中,我遇到了一個讓我發瘋的情況,因爲我無法弄清楚爲什麼某個特定的解決方案有效,而另一個解決方案不適用。C++顯示字符while循環行

因此,問題要求在每行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變量替換爲int而不是char,那麼它會以我希望的方式運行,並在應該時終止運行,只是顯示實際的數字而不是ASCII值。

只有當'字母'是一個字符,我得到一個無限循環。我確信這是一件非常簡單的事情,我現在可能太累了,無法看到它,但任何幫助/提示都將非常感謝!儘管我在技術上得到了答案,但我卻不知道爲什麼第二個答案會如此可怕地失敗。

在此先感謝。

回答

4

答案很簡單,真的不夠。以下是發生了什麼 - 在輸出行數達到112之後,(有符號的)char可以在內部循環範圍內具有值[-128,127],您將使用另一個16遞增計數,因此您也可以將字母增加16,this使字母等於112 + 16 = 128,這由於有符號字符的範圍實際上是溢出並變成了-128。所以在執行內部循環後,外部循環的條件仍然成立:-128 < 127.這也是爲什麼你會得到奇怪的字符 - 這些將是-128和32之間的值。

如何修復問題?更改檢查在內部循環: while (count < 16 && letter < 127)

+0

啊這是非常合情合理的。謝謝! – nik 2012-01-31 18:22:15

1

內while循環退出時信== 48,64,...,128。但是,因爲它是一個(簽名)炭,128被解釋爲-128和外環將不終止。 內環更改爲

while (count < 16 && letter < 127) 

,以獲得相同的行爲在你的第一個例子。

或更改字母爲int,如果是OK打印所有字符,包括127:

int letter = 32; 
... 
cout << (char)letter << " "; 
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 << ' '; 
    } 
}