C ++ Обнаружение клавиши ВВОД, нажатой пользователем - PullRequest
0 голосов
/ 10 мая 2010

У меня есть цикл, в котором я прошу пользователя ввести имя. Мне нужно остановиться, когда пользователь нажимает клавишу ВВОД ..... или когда было введено 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++;


}

Ответы [ 5 ]

4 голосов
/ 10 мая 2010

Вы преобразуете прочитанную строку в целое число с 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;
}
2 голосов
/ 10 мая 2010

getline съест ваш разделитель, который будет '\ n', поэтому вы, вероятно, захотите проверить пустую строку. Сделайте это до звонка в Атои.

2 голосов
/ 10 мая 2010

попробовать:

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);
}
1 голос
/ 10 мая 2010

Попробуйте 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;
0 голосов
/ 10 мая 2010

Вы хотите использовать cin.get (); cin >> temp; Я верю.

...