Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich lerne C ++ und Schreiben von kleinen Programmen, wie ich entlang gehen. Im Folgenden ist ein solches Programm:

// This program is intended to take any integer and convert to the
// corresponding signed char.

#include <iostream>

int main()
{
  signed char sch = 0;
  int n = 0;
  while(true){
    std::cin >> n;
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

Wenn ich dieses Programm ausführen und halten Eingänge relativ klein absolute Werte, verhält es sich wie erwartet. Aber wenn ich größere Eingänge eingeben, zum Beispiel 10000000000, spuckt das Programm wiederholt die gleiche Leistung aus. Einige Kombinationen von Eingang verursachen unberechenbares Verhalten. Zum Beispiel:

#: ./int2ch
10
10 --> 

10000000000
10 -->

10 -->

10 -->

10 -->

Das Programm spuckt „10 ->“, bis er getötet wird. (Mit dieser speziellen Sequenz von Eingaben, die Ausgabe Änderungen des Programms zu beschleunigen erratisch.) Ich habe auch bemerkt, dass die Ausgabe von großen Werten der bisherigen Recht Eingabe bestimmt wird sowie der Wert des aktuellen illegalen Eingangs.

Was ist los? (Ich kümmere mich nicht um das Programm Festsetzung, das ist einfach. Ich kann es verstehen will.)

War es hilfreich?

Lösung

Im Grunde Ihr cin Strom ist in einem Zustand fehlschlagen und somit kehrt sofort zurück, wenn Sie versuchen, es zu lesen. Rewrite Ihr Beispiel wie folgt aus:

#include <iostream>

int main()
{
  signed char sch = 0;
  int n = 0;
  while(std::cin >> n){
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

cin >> n einen Verweis auf cin zurückkehren, die Sie für „gut-ness“ in einem bedingten testen können. Also im Grunde die die „while(std::cin >> n)“ sagt „während ich immer noch von der Standardeingabe lesen konnte erfolgreich, gehen Sie wie folgt“

EDIT: Der Grund, warum es immer wieder gibt den zuletzt eingegebene guten Wert ist, weil das der letzte Wert erfolgreich eingelesen n war, die gescheiterte liest den Wert von n nicht ändern

EDIT: wie in einem Kommentar erwähnt, können Sie den Fehlerzustand löschen und versuchen Sie es erneut so etwas wie dies wahrscheinlich funktionieren würde und nur schlechte Zahlen ignorieren:

#include <iostream>
#include <climits>

int main() {
    signed char sch = 0;
    int n = 0;
    while(true) {
        if(std::cin >> n) {
            sch = n;
            std::cout << n << " --> " << sch << std::endl;
        } else {
            std::cin.clear(); // clear error state
            std::cin.ignore(INT_MAX, '\n'); // ignore this line we couldn't read it
        }
    }
}

Andere Tipps

Ja, wies Evan Teran die meisten Dinge bereits aus. Eine Sache, die ich hinzufügen möchten (da ich nicht seinen Kommentar kann noch :)) ist, dass Sie den Anruf setzen müssen iStream :: clear vor den Anruf iStream :: ignorieren. Der Grund dafür ist, dass istream :: ebenfalls ignoriert einfach, alles zu tun verweigern, wenn der Strom immer noch im Zustand fail ist.

Da Sie auf einer 32-Bit-Maschinen sind, 10000000000 ist ein zu große Zahl von einem int vertreten zu sein. Auch ein int zu char Umwandlung werden Sie nur von 0..255 oder -128..127 auf dem Compiler abhängig.

Ein Problem dabei ist, dass ein char eine Größe von einem Byte hat und somit nur eine Zahl zwischen -127 und 128 Ein int auf der anderen Seite halten kann, ist in der Regel 4 Bytes, und viel größere Werte annehmen kann. Zweites Problem ist, dass Sie einen Wert sind Eingabe, die für eine int zu groß auch ist.

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