Обнаружение C ++ введите клавишу ввода нажатой пользователем
-
25-09-2019 - |
Вопрос
У меня есть цикл, где я прошу пользователя ввести имя. Мне нужно остановить, когда пользователь нажимает клавишу Enter ..... или когда было введено 20 имен. Однако мой метод не останавливается, когда пользователь нажимает клавишу ввода
//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++;
}
Решение
Вы преобразуете строку чтения в целое число с atoi
:
int enterKey = atoi(temp.c_str());
Если Temp - это строка, как "1234"
Это будет установлено enterKey
к 1234
. Отказ Тогда вы сравните enterKey
к значению ASCII \n
. Отказ Это, скорее всего, не делает ничего полезного.
Также std::getline
Просто прочитайте персонажей, но не в том числе, следующий '\n'
. Отказ Если пользователь просто нажимает ввод, не вводите любые другие символы, std::getline
вернет пустую строку. Если строка пуста может быть легко проверена с ее empty()
Метод:
getline(cin, temp);
if (temp.empty()) {
stop = true;
}
Другие советы
GetLine будет есть ваш разделитель, который будет « N», поэтому вы, вероятно, хотите проверять пустую строку. Сделайте это до звонка на Atoi.
пытаться:
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);
}
Пытаться stop = temp.empty()
вместо. getline
не должен содержать какие-либо новые символы. Пустая линия должна привести к пустой строке.
Кроме того, Чарльз правильный, ваше время неверно, используйте 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;
Вы хотите использовать Cin.get (); CIN >> TEMP; Я верю.