我正在为计数器编写代码。如果我给'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;
}
答案 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
,这就是为什么它将始终打破您的原始代码。