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
,这就是为什么它总是会破坏您的原始代码。
我正在为计数器编写代码。如果我将 '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
,这就是为什么它总是会破坏您的原始代码。