while循环中断,我不知道原因

时间:2015-05-13 14:10:58

标签: c++ c++11 while-loop codeblocks

我正在为计数器编写代码。如果我给'a'作为输入,它应该+1计数器并在屏幕上显示它。但是当我这样做时,它在屏幕上显示1并且程序结束。我希望它一直运行,除非我给出一些其他字符作为输入。我犯的错是什么?

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    int Counter = 0;
    char t;

    while(true)
    {
        t = cin.get();
        if(t == 97)
        {
            Counter = Counter + 1;
        }
        else
            break;
        system("cls");
        cout << Counter;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:6)

问题是当你输入'a'时,你可能也会点击 Enter ,这被解释为另一个char。第二个char绝对不是a,因此您的计划会中断。这可以通过输出您阅读的内容来验证:

for (;;) {
    std::cout << '?';
    char t = std::cin.get();
    std::cout << (int)t << '\n';
    if (t != 'a') break;
}
std::cout << "done\n";

运行时打印:

?a
97   // this is 'a'
?10  // this is '\n', note the additional ?
done

最简单的解决方法是在cin上使用输入流操作符,这将放弃输入中的空格(而get()则不会):

char t;
for (;;) {
    std::cout << '?';
    std::cin >> t;
    std::cout << (int)t << '\n';
    if (t != 'a') break;
}
std::cout << "done\n";

运行时,产生:

?a
97 
?b
98 
done

这是你想要的。

答案 1 :(得分:2)

试试这个:

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    int Counter = 0;
    char t;

    while(true)
    {
        t = cin.get();
        if(t == 97)
        {
            Counter = Counter + 1;
        }
       // else
        //    break;
        system("cls");
        cout << Counter;
    }
    //system("pause");
    return 0;
}

您的else break;是您在任何交互后关闭的原因。基本上在任何迭代之后,它会因为任何非a输入而中断。但是,运行上面的代码,您将看到给定的每个a输入处的计数器增量,并且它不会中断。

这将为您提供所需的基本操作,即根据输入a递增计数器,否则不执行任何操作。

修改:上面的代码会缓冲您的输入并将其全部读取,因此,如果您有a之类的aaaaa,则会读取它并且输出5为柜台。

如果你想摆脱循环,我建议:

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    int Counter = 0;
    char t;

    while(true)
    {
        cin >> t;
       // t = cin.get();
        if(t == 97)
        {
            Counter = Counter + 1;
        }
        else
          break;
        system("cls");
        cout << Counter;
    }
    //system("pause");
    return 0;
}

我测试了它并且它有效。似乎是cin.get()如何从控制台读取缓冲输入(我认为)。对具体细节不太确定,但cin >> t可以解决问题。

编辑2:做了一些阅读,我认为cin.get()将在您输入后使用下一个字符,但在这种情况下,它是新闻空间\n,这就是为什么它将始终打破您的原始代码。