【问题标题】:Detecting ENTER key in C++在 C++ 中检测 ENTER 键
【发布时间】:2017-03-15 19:22:37
【问题描述】:

我有一个这样的程序,

char name[100];
char age[12];
cout << "Enter Name: ";
cin >> name;

cout << "Enter Age: ";
cin >> age;

现在年龄是一个可选字段,因此用户只需按 ENTER 键并将该值设置为 NULL。但问题是,cin 不带 ENTER 键,只是呆在那里等待有效的键盘字符或数字输入。

我认为问题在于 cin 需要一个有效的输入,因此会永远留在那里。

所以我尝试了以下方法来检测年龄的 ENTER 按键。

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

现在只要用户在输入名称后按下 ENTER 键,就会直接进入 IF 条件。

我也试过了:

getline(cin, age);

但这也不只是在cout &lt;&lt; "Age: "; 等待用户输入。

用户可以输入有效年龄,也可以直接按 ENTER 键不输入年龄。

对于以下代码:

cout << "Enter Name: ";
        cin >> name;

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

输出是:

Enter Name: asdf
Enter Age: ENTER WAS PRESSED

我希望光标在 输入年龄:_

处等待

我该怎么做?

【问题讨论】:

  • 如果你想让光标在Enter Age: _处等待,那么你想在哪里看到输出?
  • 即使用户按下回车,您是否希望光标在回车时等待?

标签: c++


【解决方案1】:

你试过了吗?:

cout << "Press Enter to Continue";
cin.ignore();

也可以查看this question

【讨论】:

  • 我不能使用cin &gt;&gt; myString,但我可以在cin.ignore()之后使用std::getline(std::cin, myString)
【解决方案2】:

一种方法是使用 getline 读取输入,然后测试输入字符串的长度。如果他们只按回车,则行长将为 0,因为 getline 默认忽略换行符。

std::string myString = "";

do {
     std::cout << "Press ENTER to exit" << std::endl;
     std::getline(std::cin, myString);
} while (myString.length() != 0);

std::cout << "Loop exited." << std::endl;

【讨论】:

    【解决方案3】:

    你的代码有几个问题:

    1. 您正在使用char[] 缓冲区调用operator&gt;&gt;,而没有保护缓冲区溢出。使用std::setw() 指定读取期间的缓冲区大小。否则,请使用std::string 而不是char[]

    2. cin &gt;&gt; name 仅读取第一个以空格分隔的单词,将所有剩余数据留在输入缓冲区中,包括 ENTER,然后选择该键通过cin &gt;&gt; age 向上,无需等待新的输入。为避免这种情况,您需要调用cin.ignore() 来丢弃任何未读数据。否则,请考虑使用cin.getline() 代替(或std::getline() 用于std::string),它会消耗所有内容,包括换行符,但不输出换行符(您应该考虑将其用于name 值,至少,以便用户可以输入带有空格的名称)。

    3. 默认情况下,operator&gt;&gt; 在读取新值之前会跳过前导空格,其中包括换行符。您可以按 ENTER 任意键,operator&gt;&gt; 会很高兴地一直等待,直到输入其他内容。为避免这种情况,您可以使用std::noskipws,但这会在读取字符数据时导致不必要的副作用 - 前导空白留在输入缓冲区中,这会导致operator&gt;&gt; 在任何用户输入之前读取空白字符时停止读取被读取。因此,为避免这种情况,您可以在调用cin &gt;&gt; age 之前使用cin.peek() 检查输入的换行符。

    试试这样的:

    #include <iostream>
    #include <limits>
    #include <iomanip>
    
    char name[100] = {0};
    char age[12] = {0};
    
    std::cout << "Enter Name: ";
    std::cin >> std::setw(100) >> name;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    /* or:
    if (!std::cin.getline(name, 100))
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    */
    
    std::cout << "Enter Age: ";
    if (std::cin.peek() != '\n')
        std::cin >> std::setw(12) >> age;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    或者:

    #include <iostream>
    #include <string>
    #include <limits>
    
    std::string name;
    std::string age;
    
    std::cout << "Enter Name: ";
    std::cin >> name;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    /* or:
    std::getline(std::cin, name);
    */
    
    std::cout << "Enter Age: ";
    if (std::cin.peek() != '\n')
        std::cin >> age;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    /* or:
    std::getline(std::cin, age);
    */
    

    【讨论】:

      【解决方案4】:

      当您使用cin.get() 时,编译器将采用最后使用的 Enter(即输入名称时按下 Enter 键)。所以你需要让编译器避免最后输入的回车键,所以你需要在使用cin.get()之前包含cin.ignore()

      【讨论】:

        【解决方案5】:

        您可能希望将 cin 转换为 char 变量,然后检查它是否是 ENTER 键,如果不是,则继续获取字符并将它们转换为 int(使用字符减法等)。这不是一个非常漂亮的解决方案,但它是我想到的第一件事。

        【讨论】:

          【解决方案6】:

          只需使用:

          std::cout << "\nPress Enter to continue"; 
          fgetc(stdin);
          std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
          

          http://www.cplusplus.com/reference/cstdio/fgetc/查看更多信息

          【讨论】:

            【解决方案7】:

            您可以包含“conio.h”库 并使用 getch();

            #include <conio.h>
            #include <iostream>
            
            using namespace std;
            
            int main(){
            
            cout << "press enter";
            getch();
            
            return 0;
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-19
              相关资源
              最近更新 更多