2016-01-05 15 views
5

Ich arbeite durch Bjarne Stroustrup Programmierung - Principles and Practice C++ und kam zu folgendem Beispiel:cin in C++ versucht String-Werte einer int-Variablen zuzuordnen?

#include "std_lib_facilities.h" 

int main() { 
    /* Name and Age input */ 
    cout << "Please enter your first name and age\n"; 
    string first_name = "???"; 
    int age = -1.0; 
    cin >> first_name >> age; 
    cout << "Hello," << first_name << "(age " << (age * 12) << " months)\n"; 
    return 0; 
} 

Wenn Sie das Programm und Eingabe Carlos laufen 22, es wird korrekt ausgegeben Hello, Carlos (age 22). Wenn Sie jedoch 22 Carlos eingeben, sagt er, dass die Ausgabe Hello, 22 (age -1) sein sollte, da "Carlos keine ganze Zahl ist ... wird nicht gelesen". Wenn ich es jedoch ausführe, gibt es Hello, 22 (age 0) zurück, was scheint, als ob es ihm einen Müllwert zuweist. Ich bin neugierig, warum dies geschieht, wie das Buch impliziert, dass es nicht versucht, der age Variable nichts zuzuordnen, wenn Sie eine Ganzzahl eingeben. Ich habe den Code mit Haltepunkten ausgeführt und bestätigt, dass der Wert age von -1 auf 0 wechselt, nachdem der nicht ganzzahlige Eingang eingegeben wurde.

Mache ich etwas falsch? Oder ist das eine Kuriosität aufgrund der Tatsache, dass ich es über Xcode erstelle und welcher Compiler dabei ist?

+0

Dies ist ein "undefined Verhalten", das Sie bekommen. In solchen Fällen kann die Ausgabe alles sein –

+4

C++ 11 und setzt Skalartypen auf 0, wenn die Extraktion fehlschlägt, vor C++ 11 wurde der Wert unberührt gelassen. – user657267

+0

@ user657267, Ah, danke dafür. Ich war verwirrt, weil es die aktualisierte Ausgabe des Buchs für C++ 11 war, aber nachdem ich deinen Kommentar gelesen hatte, habe ich die Errata nachgeschlagen und es war eine Notiz darüber. Vielen Dank! – Dan

Antwort

4

Wenn Sie die Spur der Anrufe aus den

cin >> age; 

Sie mit einem Aufruf an std::strtol am Ende folgen. Der Rückgabewert von strtol ist:

  • Wenn keine Konvertierung durchgeführt werden kann, wird 0 zurückgegeben.

Überprüfen Sie den Status der cin nach den Anrufen, um sicherzustellen, dass alle Extraktionen erfolgreich waren.

cin >> first_name >> age; 
if (cin) 
{ 
    // Extraction was successful. 
    // Use the data. 
} 
else 
{ 
    // Extraction was not successful. 
    // Deal with the error. 
} 
+1

Ah, das macht Sinn. Ich habe nur die Errata für das Buch nachgeschlagen und folgendes gefunden: "Das ist nicht wirklich ein Errata, aber einige Implementierungen löschen ein int, wenn >> fehlschlägt. Schließlich wird alles, aber bis C++ 11 keins. Also, Sie erhalten 0 oder -1, abhängig vom Jahrgang Ihrer Implementierung. " So wie Sie darauf hingewiesen haben, implementiert es die Standards, wie es sollte. Vielen Dank! – Dan

+1

@Dan, es ist bedauerlich, dass Bücher, sogar vom Vater der Sprache, nicht zu lange obsolet geworden sind. –

Verwandte Themen