[英]In C++ while using cin.get(), how can I not limit the number of characters a user can enter?
[英]How can I use cin.get() to detect an empty user input?
我已经编写了一些代码来检测空用户输入:
if(cin.get() == '\n')
{
cout<<"ENTER WAS PRESSED"<<endl;
}
但是由于某种原因,如果用户按ENTER键,那么在我按ENTER键时它将一直前进到下一行。
您的代码以这种形式对我有用:
#include <iostream>
int main() {
while (true) {
if (std::cin.get() == '\n') {
std::cout<<"ENTER WAS PRESSED"<<std::endl;
}
}
return 0;
}
但是,您的进一步注释表明您的代码还包括以下内容:
while(!(cin >> number) || (number < 0 || number > 3) || (cin.get() == '\n'))
有麻烦了
while
您尝试的内容在特定while
不起作用,但是许多C ++的第一学期学生也会提出类似的问题,所以让我解释一下。 它不起作用的原因是您对std::cin
概念含糊。 (顺便说一句, std::cin
,请,或cin
通过之前using std::cin;
如果你必须在告诉你问题的教科书。 using namespace std;
应烧好。)
std::cin
对象是一个流 -从您的角度来看,它是一个队列,程序可以在需要时从队列中接受可用的输入字符。 重要: std::cin
不是命令或操作,而是一个称为流的对象。 通过类比语音,您可能会认为std::cin
是一个动词,只有它不是:它是一个名词。 就其本身而言, std::cin
不执行任何操作。
提取运算符>>
是做什么的。 还可以做的事情是单字符获取成员函数.get()
。 两者都从流std::cin
检索以前看不见的字符。 因此, >>
检索程序放入number
一些字符,然后进行测试。 然后, .get()
检索另一个以前看不见的字符,程序检查该字符以查看它是否为换行符。 但是,为什么您的程序为什么将前一组字符视为可能的数字,而将后一组单个字符视为可能的换行符呢? 如何知道前一组字符不是以换行符开头?
我的建议是使用>>
或.get()
尝试一些更简单的测试程序一段时间,但不要在同一程序中同时使用它们。 现在,一次使用这两种方法会让您感到困惑。 流输入可能很棘手。 在您直截了当地说出这一点之前,您不太可能会从进一步的解释中受益,而这可能会花费您一个小时的试验和实验。 祝好运。
我认为这段代码可以完成您的工作。
#include <iostream>
#include <sstream>
using std::cin;
using std::cout;
using std::string;
int main()
{
string in = "";
int n = 0;
while (true)
{
cout << "Please enter a number: ";
getline(cin, in);
std::stringstream s(in);
if (s >> n)
break;
cout << "Invalid number, please try again\n";
}
return 0;
}
AFAIK,我认为您不应该使用get()
函数输入数字。 get()
函数旨在输入字符,其行为与未格式化的输入函数相同 。 >>
运算符似乎对此工作更好。 如果您按ENTER键,提取运算符>>
将等待您的输入,因为它将忽略它。 但是,换行输入存储在cin
输入流中。 您还可以尝试结合使用peek()
和seekg()
函数来检查输入流中是否存在现有的换行符,然后执行所需的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.