在C++中检测回车键

16

我有一个像这样的程序,

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;
        }

现在,当用户输入名称并按下回车键时,它直接进入IF条件。

我也尝试过:

getline(cin, age);

但这并不仅仅止于 cout << "Age: "; 等待用户输入。

用户可以输入有效年龄,也可以只是按下回车键不输入年龄。

以下是代码:

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

我希望光标停留在输入年龄:_处。

我该怎么做呢?


如果你想让光标停留在“输入年龄:_”处,那么你想在哪里看到输出? - BusyProgrammer
当用户按下回车键时,您是否希望光标停留在输入年龄的位置? - Sniper
7个回答

14

您尝试过这个吗?:

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

也可以查看此问题


2
我不能使用 cin >> myString,但是在 cin.ignore() 之后我可以使用 std::getline(std::cin, myString) - Cava
cin.ignore()不起作用。它会发出信号:终止,我怀疑它认为已经读取了行尾符。 - David Richardson

6

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

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;

2
您的代码存在几个问题:
  1. 在没有保护缓冲区免受缓冲区溢出的情况下,您正在使用带有char[]缓冲区的operator>>。使用std::setw()在读取时指定缓冲区大小。否则,请改用std::string而不是char[]

  2. cin >> name只读取第一个以空格为分隔符的单词,并将其余数据留在输入缓冲区中,包括ENTER键,然后由cin >> age读取而无需等待新输入。要避免这种情况,需要调用cin.ignore()来丢弃任何未读取的数据。否则,考虑改用cin.getline()(或std::getline()用于std::string),它会消耗完所有内容,直到包括换行符,但不会输出换行符(至少应该考虑对name值使用此选项,以便用户可以输入其中带有空格的名称)。

  3. 默认情况下,operator>>在读取新值之前跳过前导空格,包括换行符。您可以尝试按ENTER键,但是operator>>会一直等待输入其他内容。要避免这种情况,您可以使用std::noskipws,但是这在读取字符数据时会导致副作用-前导空格留在输入缓冲区中,这会导致operator>>在读取用户输入之前读取任何空格字符时停止读取。因此,为了避免这种情况,可以在调用cin >> 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);
*/

1
当您使用cin.get()时,编译器将获取最近使用的Enter键(即在输入名称时按下的Enter键)。因此,您需要让编译器避免最后输入的Enter键,为此,在使用cin.get()之前,您需要包含cin.ignore()

0
你可能想要使用 cin 将字符输入到一个 char 变量中,然后检查它是否是 ENTER 键,如果不是,则继续获取字符并将它们转换为 int(使用字符减法等)。这不是一个很漂亮的解决方案,但它是我脑海中想到的第一件事情。

0

0
你可以包含"conio.h"库,并使用getch();
#include <conio.h>
#include <iostream>

using namespace std;

int main(){

cout << "press enter";
getch();

return 0;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接