2012-01-31 59 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 << ' '; 
    } 
}