Question

J'ai une boucle où je demande à l'utilisateur d'entrer un nom. Je dois arrêter lorsque l'utilisateur appuie sur la touche ENTRER ..... ou lorsque 20 noms ont été saisis. Cependant ma méthode ne s'arrête pas lorsque l'utilisateur appuie sur la touche ENTRER

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


}
Était-ce utile?

La solution

Vous convertissez la chaîne de lecture à un nombre entier avec atoi:

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

Si température est une chaîne comme "1234" cela mis enterKey à 1234. Ensuite, vous comparez enterKey à la valeur ASCII de \n. Ceci est très probablement ne fait rien utile.

En outre std::getline suffit de lire les caractères jusqu'à, mais sans inclure, la prochaine '\n'. Si l'utilisateur appuie simplement entrer sans saisir d'autres caractères, std::getline renverra une chaîne vide. Si une chaîne est vide peut être facilement testé avec sa méthode empty():

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

Autres conseils

getline mangera votre delimiter, qui sera « \ n », si vous voulez probablement être vérifier pour une chaîne vide. Faites-le avant l'appel à atoi.

essayer:

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

Essayez stop = temp.empty() à la place. getline ne doit pas contenir de caractères de nouvelle ligne. Une ligne vide devrait se traduire par une chaîne vide.

En outre, Charles est exact, en condition est incorrecte, utilisez while( !stop && ind < 20). La façon dont vous l'avez écrit l'utilisateur doit saisir 20 valeurs, et une ligne vide. changement Charles dit à rompre lorsque l'état est atteint (pas les deux).

Par souci d'exhaustivité, voici le nouveau code proposé:

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

Personnellement, je voudrais écrire le code comme suit:

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;

Vous voulez utiliser cin.get (); cin >> temp; Je ne crois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top