C++ C++;检测用户按下的回车键

C++ C++;检测用户按下的回车键,c++,user-input,getline,C++,User Input,Getline,我有一个循环,要求用户输入名称。当用户按ENTER键时,我需要停止。。。。。或者当输入了20个名称时。但是,当用户按下ENTER键时,我的方法不会停止 //loop until ENTER key is entered or 20 elements have been added bool stop = false; int ind = 0; while( !stop || ind >= 20 ){ cout << "Enter name #" << (i

我有一个循环,要求用户输入名称。当用户按ENTER键时,我需要停止。。。。。或者当输入了20个名称时。但是,当用户按下ENTER键时,我的方法不会停止

//loop until ENTER key is entered or 20 elements have been added
bool stop = false;
int ind = 0;
while( !stop || ind >= 20 ){

    cout << "Enter name #" << (ind+1) << ":";
    string temp;
    getline(cin, temp);
    int enterKey = atoi(temp.c_str());        

    if(enterKey == '\n'){
        stop = true;            
    }
    else{
        names[ind] = temp;
    }

    ind++;


}
//循环,直到输入ENTER键或添加了20个元素
bool-stop=false;
int ind=0;
而(!stop | | ind>=20){
试试看:

while(!stop&ind<20)
或:

使用名称空间std;
向量名称;//已编辑。
对于(int-ind=0;ind<20;++ind)
{

coutgetline将吃掉您的分隔符,它将是“\n”,因此您可能希望检查空字符串。在调用atoi之前执行此操作。

请尝试
stop=temp.empty()
getline
不应包含任何新行字符。空行应导致空字符串

此外,Charles是正确的,while条件不正确,请使用
while(!stop&&ind<20)
。按照编写方式,用户需要输入20个值,并输入一个空行。Charles的更改表示在满足任一条件(不是同时满足这两个条件)时中断

为了完整起见,以下是建议的新代码:

bool stop = false;
int ind = 0;
while( !stop && ind < 20 ){

    cout << "Enter name #" << (ind+1) << ":";
    string temp;
    getline(cin, temp);
    if(temp.empty()) {
        stop = true;
    } else {
        names[ind] = temp;
    }

    ind++;    
}
bool-stop=false;
int ind=0;
同时(!停止和指示<20){

是否可以使用
atoi
将读取的字符串转换为整数:

int enterKey = atoi(temp.c_str());        
如果temp是一个类似于
“1234”
的字符串,则将
enterKey
设置为
1234
。然后将
enterKey
\n
的ASCII值进行比较。这很可能没有任何用处

另外,
std::getline
只需读取下一个
'\n'
之前但不包括的字符。如果用户只需按enter键而不键入任何其他字符,
std::getline
将返回空字符串。如果字符串为空,则可以使用其
empty()
方法轻松测试:

getline(cin, temp);
if (temp.empty()) {
  stop = true;
}

您想使用cin.get();cin>>temp;我相信。

是的,我完全同意,对于
循环,使用
是一种可行的方法。但是,您的代码有一个bug。生成的向量将有20个空字符串,后面有一些响应。您省略了atoi步骤。您应该使用一个向量,而不是vector@James:他应该检查输入的长度(为了检测空行),他应该检查流状态,因为这是很好的编码。@jmucchiell,OP没有将int插入到容器中,int只用于检测新行。谢谢@Geoff编辑正确。在键入它的中途改变了主意,将使用名称[ind]所以user69514不会太困惑,而是采用最佳实践……为什么不在temp.empty()时中断呢那么你不需要else结构啊。是的。你应该也忘记翻转ind>=20条件。我同意,它应该是一个带中断的for循环。如果我们重新编写OP最初的所有问题,可能不清楚。我添加了我的个人偏好,我认为这与你的@jmucchiello
cin>>temp
一致一个标记。OP可能需要包含空格的语句。
vector<string> names;
for(int ind = 0; ind < 20; ind++) {
  cout << "Enter name #" << (ind + 1) << " (blank to stop): ";
  string name;
  getline(cin, name);
  if(name.empty() || cin.eof()) {
     break;
  }
  names.push_back(name);
}

cout << "Read " << names.length() << " names before empty line detected." << endl;
int enterKey = atoi(temp.c_str());        
getline(cin, temp);
if (temp.empty()) {
  stop = true;
}