Pergunta

Eu tenho um loop onde peço ao usuário que insira um nome. Preciso parar quando o usuário pressiona a tecla Enter ... ou quando 20 nomes foram inseridos. No entanto, meu método não para quando o usuário pressiona a tecla 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++;


}
Foi útil?

Solução

Você converte a string de leitura em um número inteiro com atoi:

int enterKey = atoi(temp.c_str());        

Se temp é uma corda como "1234" isso vai definir enterKey para 1234. Então você compara enterKey para o valor ASCII de \n. Provavelmente isso não está fazendo nada útil.

Também std::getline Basta ler os personagens até, mas não incluindo, o próximo '\n'. Se um usuário apenas pressiona, entre sem digitar outros caracteres, std::getline retornará uma string vazia. Se uma string estiver vazia pode ser facilmente testada com seu empty() método:

getline(cin, temp);
if (temp.empty()) {
  stop = true;
}

Outras dicas

GetLine comerá seu delimitador, que será ' n', então você provavelmente deseja verificar uma corda vazia. Faça isso antes da chamada para Atoi.

tentar:

while( !stop && ind < 20 )

ou:

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);
}

Tentar stop = temp.empty() em vez de. getline não deve conter caracteres de linha nova. Uma linha vazia deve resultar em uma string vazia.

Além disso, Charles está correto, sua condição enquanto está incorreta, use while( !stop && ind < 20). A maneira como você escreveu, o usuário precisa inserir 20 valores e uma linha vazia. A mudança de Charles diz para quebrar quando qualquer uma das condições é atendida (não ambas).

Por uma questão de completude, aqui está o novo código proposto:

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++;    
}

Pessoalmente, eu escreveria o código da seguinte forma:

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;

Você deseja usar o cin.get (); CIN >> Temp; Eu acredito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top