while循环中断,我不知道为什么

While-loop breaks, and I don't know the reason why

我正在为计数器编写代码。如果我将 '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;
}

问题是当您输入 '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

这正是您想要的。

试试这个:

#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 增加计数器,否则什么也不做。

编辑: 上面的代码将缓冲您的输入并读取所有内容,因此如果您有 5 个 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,这就是为什么它总是会破坏您的原始代码。