C++ C++;检测用户按下的回车键
我有一个循环,要求用户输入名称。当用户按ENTER键时,我需要停止。。。。。或者当输入了20个名称时。但是,当用户按下ENTER键时,我的方法不会停止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
//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最初的所有问题,可能不清楚。我添加了我的个人偏好,我认为这与你的@jmucchiellocin>>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;
}