【问题标题】:How can I use cin.get() to detect an empty user input?如何使用 cin.get() 来检测空的用户输入?
【发布时间】:2013-07-12 19:15:11
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为你必须使用 noskipws 或类似的东西。默认情况下 cin 跳过空格,\n 是空格 IIRC。
  • 对不起,我忘了提到用户应该输入一个数字,我想知道该怎么做,以确保如果用户按下 ENTER,则会弹出警告消息
  • 一直问,直到你得到你想要的?
  • @Borgleader:空白和/n 是不同的实体。编译器对它们的处理方式不同。另外,空格的 ASCII 值为 32,\n 的 ASCII 值为 10。
  • @ChosenTorture:C++ 编译器将\n 视为此处讨论的所有上下文的空格。

标签: c++ input


【解决方案1】:

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

#include <iostream>

int main() {
    while (true) {
        if (std::cin.get() == '\n') {
            std::cout<<"ENTER WAS PRESSED"<<std::endl;
        }
    }
    return 0;
}

但是,您进一步的 cmets 显示您的代码还包括以下内容:

    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 本身不会做任何事情。

做某事的是提取运算符&gt;&gt;。单字符提取成员函数.get() 也有作用。这两个都从流std::cin 中检索以前看不见的字符。因此,&gt;&gt; 检索程序放入number 的一些字符,然后进行测试。然后.get() 检索另一个, 以前看不见的字符,程序检查它是否是换行符。但是为什么您的程序将前一组字符视为可能的数字,而将后一组字符视为可能的换行符?它怎么知道前一组字符不是以换行符开头的?

我的建议是尝试一些更简单的测试程序一段时间,使用&gt;&gt;.get(),但不能在同一个程序中同时使用。目前,同时使用两者会让您感到困惑是可以理解的。流输入可能很棘手。在你把这一点直接记在心里之前,你不太可能从进一步的解释中受益,这可能需要你一个小时的试验和实验。祝你好运。

【讨论】:

  • 我在一个while循环中
  • while(!(cin >> number) || (number 3) || (cin.get() == '\n'))
  • 这里也是新手:为什么不应该使用“using namespace std;”?
  • @Bobby:因为“使用命名空间标准;”转储标准命名空间。它禁用了 C++ 关于标准库符号的命名空间机制。例如,假设您定义了一个函数bar()。假设您稍后无意中将其称为baz()。没问题,对吧?编译器会为你标记这个。但是,假设标准库提供了std::baz()。 “使用命名空间标准;”之后会发生什么?更好的是“使用 std::baz;”这不是转储数百个程序员不知道的标准库符号,而是只导入一个所需的符号。
  • @Bobby:C++ 在被用作教学语言之前取得了商业上的成功。不幸的是,在美国学术市场上,仍然相当广泛使用的第一批广泛使用的教科书之一(我将避免在这里命名它的尴尬)被机会主义地引入当时可用的大学 C++ 教科书的空白作者并不真正了解 C++。那位作者让学生转储命名空间。转储命名空间是 C++ 中的一种反惯用技巧。我不会推荐它。
【解决方案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&gt;&gt; 运算符似乎更适合这项工作。如果您按下 ENTER 键,提取运算符&gt;&gt; 将等待您的输入,因为它将忽略它。但是,换行输入存储在cin 输入流中。您还可以尝试结合使用 peek()seekg() 函数来检查输入流中的现有换行符输入并执行您想要的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多