在一个简单的循环中c ++程序中的错误

时间:2015-05-11 15:28:52

标签: c++ while-loop cin

我正在尝试尽可能少的代码行来解决这个问题。

问题陈述:
有人设法打招呼,如果可以从输入的单词中删除几个字母,这样就会产生“hello”这个词......我正在测试他是否可以

#include <iostream>
int main() {
    char c;
    int i=0; 
    while(i!=5 && (cin>>c) && c!='\n'){
        if(c=="hello"[i])
            i++;
    }
    cout<<((i==5)?"YES":"NO");
}

当它应该打印“NO”时有一个错误。程序等待更多输入。我认为循环在i==5之前没有完成,但它永远不会在c=='\n'完成。

2 个答案:

答案 0 :(得分:2)

在你打包你的程序以最小化LOC之前(我认为你有充分的理由去关心这个,因为否则这是一个愚蠢的事情)做对了!

尝试在cin&gt;&gt; c测试之前进行i!= 5测试。否则,当你得到一个&#34; hello&#34;

时,你会读一个额外的角色

编辑:为了清楚起见,问题中的代码现在已被修改以包含此建议。

答案 1 :(得分:0)

你有一个while循环

while(i!=5 && (cin>>c) && c!='\n')
{ ... }

...您可以重写以便于调试。一般来说,而不是任何循环...

while (X)
{ Y }

...你也可以写......

while (true)
{
    if (!X) break;
    Y
}

对于你的循环,这就是这段代码:

while (true)
{
    if (!(i!=5 && (cin>>c) && c!='\n'))
        break;
    ...
}

现在,我假设您了解逻辑AND运算符的短路评估。如果没有,请在网上搜索该术语!有了这些知识,你可以像这样重写你的循环:

while (true)
{
    if (!(i!=5))
        break;
    if (!(cin>>c))
        break;
    if (!(c!='\n'))
        break;
    ...
}

当然,你仍然可以在那里简化一些双重否定,但这个想法应该是清楚的。此更改现在允许您例如在调试器中逐步执行此操作以分别评估每个循环退出条件。这很重要,因为第二个循环条件也有副作用!另外,你可以例如添加一些调试输出,告诉您退出循环的原因。此外,对于具有副作用的检查,您可以检查中间状态(或输出状态,如果您喜欢这种方式),这将使您进一步了解该问题。

最后,>>上的所有istreams运算符默认跳过空格,其中包括空格,制表符和换行符,因此最后一次检查将永远不会导致循环退出。你可以告诉流不要跳过空格,如果这是你想要的。如何做到这一点应该非常简单,找出使用其他网络搜索。 ;)