我有一个循环,我要求用户输入一个名字。当用户按下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++;
}
答案 0 :(得分:4)
您将读取的字符串转换为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;
}
答案 1 :(得分:2)
尝试:
while( !stop && ind < 20 )
或:
using namespace std;
vector <string> names; // edited.
for (int ind = 0; ind < 20; ++ind)
{
cout << "Enter name #" << (ind+1) << ":";
string temp;
getline(cin, temp);
if (temp.empty())
break;
names.push_back(temp);
}
答案 2 :(得分:2)
getline将占用你的分隔符,它将是'\ n',所以你可能想要检查一个空字符串。在打电话给atoi之前做。
答案 3 :(得分:1)
请尝试使用stop = temp.empty()
。 getline
不应包含任何换行符。空行应该会产生一个空字符串。
此外,Charles是正确的,您的状况不正确,请使用while( !stop && ind < 20)
。你写它的方式用户需要输入20个值和一个空行。当任何一个条件得到满足时,查尔斯的改变就会破裂。(
为了完整起见,这是建议的新代码:
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++;
}
就个人而言,我会按如下方式编写代码:
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;
答案 4 :(得分:0)
你想使用cin.get(); cin&gt;&gt;温度;我相信。