Обнаружение C ++ введите клавишу ввода нажатой пользователем

StackOverflow https://stackoverflow.com/questions/2803502

  •  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; Я верю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top