检测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 

我希望光标等待输入年龄:_

我怎样才能做到这一点?

+0

显示你的整个代码哪里出了问题“当你输入名字仍然进入,如果” – Sniper

+0

更新的代码和当前输出。 –

+0

如果您希望光标在'Enter Age:_'处等待,那么您想在哪里看到输出? –

您是否尝试过这个?:

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

还检查了this question

+0

我认为加入cin.ignore()正在为我工​​作。 –

您可能需要输入一个char变量,然后检查它是否为ENTER键,如果不是,继续获取字符并将它们转换为int(使用字符减法和所有这些)。这不是一个非常漂亮的解决方案,但它是我头脑中的第一件事。

你几个问题,你的代码:

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

  2. cin >> name只读取第一空格分隔单词,留下的任何剩余的数据在输入缓冲器中,包括ENTER键,然后由cin >> age无需等待新的输入拾取。为避免这种情况,您需要拨打cin.ignore()来丢弃任何未读数据。否则,请考虑使用cin.getline()代替(或std::getline()代替std::string),它会消耗所有包括换行符在内的所有内容,但不会输出换行符(至少应该考虑将此值用于name值,以便用户可以输入名称在他们的空间)。

  3. 默认情况下,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); 
*/