Frage

Ich habe eine Schleife, wo ich den Benutzer auffordern, einen Namen einzugeben. Ich muss aufhören, wenn der Benutzer die ENTER-Taste ..... oder wenn 20 Namen eingegeben wurden. Allerdings meine Methode nicht stoppen, wenn der Benutzer die ENTER-Taste

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


}
War es hilfreich?

Lösung

Sie wandeln die Lesezeichenfolge auf eine ganze Zahl mit atoi:

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

Wenn Temp eine Zeichenfolge wie "1234" ist, wird dieser enterKey auf 1234 gesetzt. Dann vergleichen Sie enterKey auf den ASCII-Wert von \n. Dies wird höchstwahrscheinlich nicht etwas Sinnvolles zu tun.

Auch std::getline nur die Zeichen lesen bis zu, aber nicht einschließlich, der nächste '\n'. Wenn ein Benutzer geben Sie einfach drückt, ohne andere Zeichen eingeben, std::getline wird eine leere Zeichenfolge zurück. Wenn ein String leer ist leicht mit seiner empty() Methode getestet werden kann:

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

Andere Tipps

getline Ihren Begrenzer essen, das wird ‚\ n‘, so mögen Sie wahrscheinlich für eine leere Zeichenfolge zu überprüfen. Tun Sie es vor dem Aufruf von atoi.

versuchen:

while( !stop && ind < 20 )

oder:

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

Versuchen stop = temp.empty() statt. getline sollten keine neuen Online-Zeichen enthalten. Eine leere Zeile in einem leeren String führen sollte.

Auch Charles korrekt ist, Ihre während Bedingung falsch ist, Gebrauch while( !stop && ind < 20). Die Art und Weise Sie es den Bedürfnissen der Benutzer geschrieben haben 20 Werte eingeben, und eine leere Zeile. Charles' Wechsel sagt zu brechen, wenn eine Bedingung erfüllt ist (nicht beide).

Aus Gründen der Vollständigkeit, hier ist der vorgeschlagene neue Code:

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

Ich persönlich würde den Code schreiben, wie folgt:

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;

Sie möchten cin.get () verwenden; cin >> Temp; Ich glaube.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top