C ++ Detecting ENTER-Taste vom Benutzer gedrückt
-
25-09-2019 - |
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++;
}
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.