Das Programm wartet nicht auf cin
int x=0;
string fullname = "";
float salary;
float payincrease;
float newsal;
float monthlysal;
float retroactive;
while(x<3){
cout << "\n What is your full name?";
cin >> fullname;
cout << "\n What is your current salary? \t";
cin >> salary;
cout << "\n What is your pay increase? \t";
cin >> payincrease;
newsal = (salary*payincrease)+salary;
monthlysal = newsal/12.00;
retroactive = (monthlysal*6)-(salary/2);
cout << "\n" << fullname << "'s SALARY INFORMATION";
cout << "\n New Salary \t Monthly Salary \t Retroactive Pay";
cout << "\n \t" << newsal << "\t" << monthlysal << "\t" << retroactive;
x++;
}
Meine Schleife scheint nicht zu stoppen, jedes mal, wenn cin ist gefragt, und statt sofort führt die Schleife 3 mal auf seinen eigenen. Wie bekomme ich es zu stoppen, wenn input ist gefragt?
cin
Haltestellen zu Räumen. Es wird funktionieren, wenn Sie geben Sie ein Wort in einer Zeit. Andernfalls verwenden Siestd::getline
.- Sie müssen nie schreiben, eine Eingabe, die nicht sofort erfasst innerhalb eines booleschen Kontext. Ansonsten gibt es nicht zu sagen, wie Sie Ihr Programm könnte fließen. Keine Stelle suchen, nicht weiter.
cin
selbst nicht "stop", die speziell auf Bereiche;operator>>(istream&,string&)
tut standardmäßig.- Ich Schätze Ihre pedancy. Sie sind richtig, natürlich.
cin
ist nur ein Objekt. - Sie versuchen, die Eingabe Leerzeichen in deinem ganzen Namen? Wenn dem so ist, das erste Wort (Vorname) ist zu Lesen, wie der vollständige name, dann das zweite Wort (Nachname) umgewandelt wird, um die Lohn — und die schlägt fehl, aber Sie wissen nicht, überprüfen Sie die Konvertierung...
- Sie es zu schätzen) --konnte nicht widerstehen.
- Etwas schien ein wenig seltsam, wenn ich getippt, dass... Nicht sicher, warum ich es Tat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn der input-stream nicht leer ist, wenn Sie anrufen, cin, dann cin verwendet die Daten schon im Puffer anstatt zu warten, für mehr von dem user. Sie sind mit der extraction-operator, also bei cin ist das senden der Werte der Variablen, es überspringt führende whitespace-Zeichen in den Puffer und hält auf der nächsten whitespace-Zeichen.
Setzen Sie einen Haltepunkt auf diese Zeile:
Führen Sie das Programm, und geben Sie Bob Smith. Wenn Sie den Haltepunkt erreicht, bewegen Sie Ihren cursor über Ihr string fullname. Du wirst sehen, es speichert nur "Bob", nicht "Bob Smith". "Bob Smith" bekam in den Puffer, aber wenn man mit cin mit der Extraktion Betreiber, es überspringt alle führenden whitespace-Zeichen, legt der nächste Wert, den es findet in Ihr variable, dann halt auf der nächsten whitespace-Zeichen. Um dies zu demonstrieren, versuchen Sie dies ausführen:
Wenn Sie geben in "Bob Smith", wird es nehmen Sie Ihre Eingabe nur einmal, obwohl Sie Sie nennen cin zweimal. Sie werden jedoch sehen, dass sowohl "Bob" und "Smith" bekam gefangen in der strings str1 und str2.
Daher können Sie davon ausgehen, dass cin Stoppt Auffüllen Ihren string fullname, wenn es um den Raum zwischen Bob und Smith. Bei Ihrem nächsten Aufruf von cin, die Puffer enthält noch "Smith", so dass statt mehr Eingaben vom Benutzer, versucht es zu füllen Sie Ihre Variablen Vergütungen mit "Smith". Natürlich ist dies nicht das, was du willst zu tun. Sie können call flush und ignorieren auf cin löschen Sie den Puffer, bevor jedes mal, wenn Sie cin, oder stattdessen können Sie fix Ihre Logik und verwenden Sie getline, um in den vollständigen Namen, einschließlich Leerzeichen.
Um Ihr problem zu beheben, ist alles was Sie tun müssen, ist, verwenden Sie getline anstelle von cin >>, so ersetzen Sie diese Zeile:
mit dabei:
Zweitens, bist du mit einer while-Schleife ausführen einer Reihe von Aktionen eine bestimmte Anzahl von Zeiten. Das ist in der Regel etwas, das Sie verwenden würden, eine for-Schleife.
Nebenbei, man könnte auch schreiben winzigen input-Validierung-Schleifen, die Ihnen helfen können, debug oder sonst zu vermeiden versucht, um zu setzen ungültige Eingabe in der Variablen (wie "Smith" in einen float -). So etwas wie dies funktionieren könnte:
Beachten Sie, dass cin gibt einen Wert zurück, so können Sie es in eine if-Anweisung. Wenn es eine gültige Eingabe, wird true zurückgegeben. Wenn nicht, wird false zurückgegeben. Um es deutlicher, man könnte auch einfach eine normale Aufruf von cin, ohne die if-Anweisung und überprüfen Sie dann, ob cin.gut(), die Beträge, die im Grunde den gleichen Effekt hat. Wenn Sie nicht Visual Studio verwenden, und bekommen Sie eine Fehlermeldung, INT_MAX, müssen Sie möglicherweise die #include-Grenzen.h um es zu beheben.
operator<<()
zu erscheinen wie es ist ignoriert.cin>>
. Kann ich es beheben ohne Verwendung von getline()?Dass tritt auf, wenn Sie input a
char
wo einint
erwartet.Verwenden
cin.clear();
undcin.ignore(numeric_limits<streamsize>::max(), '\n');
zu begrenzen, ein Beitrag zuint
's nur.Andere als die, es nicht zu überspringen, wenn der richtige Datentyp stellen.