1

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

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

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

4

2 回答 2

8

在这种形式下,您的代码对我有用:

#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(),但不能在同一个程序中同时使用。目前,同时使用两者会让您感到困惑是可以理解的。流输入可能很棘手。在你把这一点直接记在心里之前,你不太可能从进一步的解释中受益,这可能需要你一个小时的试验和实验。祝你好运。

于 2013-07-12T19:23:42.547 回答
3

我认为这段代码可以完成你的工作。

#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()函数来检查输入流中现有的换行符输入并执行您想要的操作。

于 2013-07-12T22:30:38.763 回答