如何使用cin.get()来检测空的用户输入?

时间:2013-07-12 19:15:11

标签: c++ input

我写了一些代码来检测空的用户输入:

if(cin.get() == '\n')
{
   cout<<"ENTER WAS PRESSED"<<endl;
}

但是由于某种原因,如果用户按下ENTER,它只是按下ENTER继续前进到下一行。

2 个答案:

答案 0 :(得分:6)

在这种形式下,您的代码适合我:

#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一起使用,但许多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(),但不能同时使用同一程序。就目前而言,同时使用两者都可以让你感到困惑。流输入可能很棘手。在你完全理解这一点之前,你不太可能从进一步的解释中受益,这可能需要你一个小时的试验和实验。祝你好运。

答案 1 :(得分:2)

我认为这段代码能够完成你的工作。

#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()函数用于输入字符,其行为为Unformatted Input Function>>运营商似乎更适合这份工作。如果按ENTER键,提取操作符>>将等待您的输入,因为它将忽略它。但是,换行输入存储在cin输入流中。您还可以尝试peek()seekg()函数的组合来检查输入流中的现有换行输入并执行您想要的操作。