2017-03-17 2 views
-1

Ich versuche einen Emulator für etwas zu erstellen, und in der Hauptschleife für den Prozessor wollte ich einen einfachen Weg implementieren, die CPU eine Schleife nach der anderen (Drücken Sie dazu die Eingabetaste, um die einzelnen Schritte anzuzeigen. So kann ich sehen, welche Anweisungen in den einzelnen Schritten ausgeführt werden. Darüber hinaus können Sie eine Zahl anstelle von nur Eingabe eingeben, um den Standardschrittbetrag von 1 auf etwas anderes zu ändern (so wird x Anzahl der Zyklen übersprungen und anschließend wieder zu 1 zurückgestellt.C++ - fgets() ignoriert nachfolgende Eingaben, wenn Enter gedrückt wird

Das Problem ist, dass es gut funktioniert, wenn ich eine Zahl eintrage (überspringe diese Anzahl von Zyklen und dann wiederhole mich jeden Zyklus), aber wenn ich nur die Enter-Taste drücke, anstatt eine Nummer einzugeben, möchte ich, dass sie standardmäßig auf 1 steht es nur durch das ganze Programm laufen lassen, ohne mich jemals aufgefordert wieder. Wie kann ich == 1?

void CPU_loop() 
{ 
    ... 


    static int step = 1; 
    char cmd[10]; 
    if(step == 1) 
    { 
     if(fgets(cmd, 10, stdin) != NULL) // If you entered something other than Enter; doesn't work 
     { 
      step = std::atoi(cmd); // Set step amount to whatever you entered 
     } 
    } 
    else 
    { 
     --step; 
    } 

    ... 
} 
+0

einfach manuell die Eingabe von stdin selbst lesen 'getchar' verwenden. Legen Sie den Text einfach in einen Puffer, bis Sie das Zeilenumbruchzeichen erhalten. Dann können Sie den Text wie gewünscht bearbeiten. – bace1000

+0

Was ist der Wert von 'cmd', wenn Sie die Eingabetaste drücken? Was ist dann der Wert von "Schritt"? –

Antwort

1

eingeben Wenn Sie direkt die Eingabetaste drücken, ist es nicht zu 1 Verzug, sondern sind vorbei Sie die str ing "\n" zu std::atoi(), std::atoi() kann nicht verwendet werden Plausibilitätsprüfung durchzuführen darauf Eingabe ist, können Sie eine andere Funktion für die wie std::strtol() oder verwenden Sie einfach

if (step == 0) 
    step = 1; 

hinzufügen können, weil, wenn, std::atoi() eine "\n" als Eingabe, es gibt 0 zurück. Lesen Sie die documentation, um es weiter zu verstehen.

unter Angabe der Dokumentation

Wert Integer auf den Inhalt von str auf Erfolg entspricht. Wenn der konvertierte Wert außerhalb des Bereichs des entsprechenden Rückgabetyps liegt, ist der Rückgabewert nicht definiert. Wenn keine Konvertierung durchgeführt werden kann, wird 0 zurückgegeben.

Noch eine Sache, Sie könnten es tun die C++ Art mit Streams für die Eingabe all dies zu vermeiden.

+0

Vielen Dank! Das hat perfekt funktioniert. Die ganze Zeit dachte ich, dieses Problem entspringe eher Füssen als Atoi. Ich wünschte, ich hätte nicht über eine Stunde verschwendet, um das falsche Problem zu lösen! –

0

könnten Sie tun:

if (fgets(cmd, 10, stdin) != NULL) 
{ 
    if (cmd[0] == '\n'){ 
     step = 1; 
    } 
    else{ 
     step = std::atoi(cmd); // Set step amount to whatever you entered 
    } 
} 
+0

Tut uns leid, aber wenn ENTER gedrückt wird, wird es "" \ n "' an 'std :: atoi()' übergeben. –

+0

Es tut mir leid. Bearbeitet. – ChrisB

Verwandte Themen