检测ENTER键在C++
我有一个这样的程序,检测ENTER键在C++
char name[100];
char age[12];
cout << "Enter Name: ";
cin >> name;
cout << "Enter Age: ";
cin >> age;
现在的年龄是一个可选字段,所以用户只需按下ENTER键,有一个空值。但问题是,cin不采用ENTER键,只是呆在那里等待有效的键盘字符或数字输入。
我认为这个问题是因为cin需要一个有效的输入,因此永远呆在那里。
所以我尝试了下面的方法来检测ENTER键按Age。
cout << "Enter Age: ";
if (cin.get() == '\n') {
cout << "ENTER WAS PRESSED" << endl;
}
现在只要用户在输入名称后按下ENTER键,就会直接进入IF条件。
我也试过:
getline(cin, age);
但也根本没有在cout << "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
我希望光标等待输入年龄:_
我怎样才能做到这一点?
我认为加入cin.ignore()正在为我工作。 –
您可能需要输入一个char变量,然后检查它是否为ENTER键,如果不是,继续获取字符并将它们转换为int(使用字符减法和所有这些)。这不是一个非常漂亮的解决方案,但它是我头脑中的第一件事。
你几个问题,你的代码:
您呼叫
operator>>
与char[]
缓冲区没有从保护缓冲区溢出。使用std::setw()
指定读取期间的缓冲区大小。否则,请使用std::string
而不是char[]
。cin >> name
只读取第一空格分隔单词,留下的任何剩余的数据在输入缓冲器中,包括ENTER键,然后由cin >> age
无需等待新的输入拾取。为避免这种情况,您需要拨打cin.ignore()
来丢弃任何未读数据。否则,请考虑使用cin.getline()
代替(或std::getline()
代替std::string
),它会消耗所有包括换行符在内的所有内容,但不会输出换行符(至少应该考虑将此值用于name
值,以便用户可以输入名称在他们的空间)。默认情况下,
operator>>
在读取新值之前跳过前导空白,并且包含换行符。你可以按输入所有你想要的,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);
*/
显示你的整个代码哪里出了问题“当你输入名字仍然进入,如果” – Sniper
更新的代码和当前输出。 –
如果您希望光标在'Enter Age:_'处等待,那么您想在哪里看到输出? –