2017-09-26 5 views
1
  • Liste item

Ich habe ein Problem mit getchar() method.What ich versuche, einen kleinen Montage-Simulator mit 8 Befehlen zu berechnen, die ADD Rx Ry durch den Benutzer in Form geschrieben werden Dabei sind Rx und Ry die Register. Es ist mir nicht erlaubt, Strings oder Arrays zu verwenden, daher ist die einzige Möglichkeit, Char by Char zu lesen.GetChar() Funktion seltsam

Mein Problem ist, dass ich weiß nicht, wie mehrere Zeichen aus einer Zeile der Eingabe von Text zu lesen und es in variables.For Beispiel setzen, ADD Rx Ry ich A in ch1, D in ch2 und D in ch3 speichern will, dann überspringen Platz verifizieren R und speichern x in einer Variablen und dann das gleiche für y.

Das Merkwürdige ist, dass, wenn ich Eingabe der zweite Befehl nach dem ersten ein, das Programm, das unter nur nicht exakt die gleichen Druckwerte zeigen, gezeigt wird (der Druck nur für die Fehlersuche ist)

do{ 
    ch1=getchar(); 
    ch2=getchar(); 
    ch3=getchar(); 
    if(ch1=='E' && ch2=='N'&& ch3=='D'){ 
    break; 
    } 
    printf("%c",ch1); 
    printf("%c",ch2); 
    printf("%c",ch3); 
}while(1); 
+0

Welche Eingabe geben Sie? Enthält es Zeilenumbrüche? Liest du die Zeilenschaltung? Welche Leistung haben Sie erwartet? Was für eine Ausgabe bekommst du? –

+0

Sie müssen auch den Zeilenumbruch lesen. –

Antwort

0

Wenn der Benutzer "ADD Rx Ry", treffen wird er ein.

getchar() verbraucht jeweils ein Zeichen.

Also, um diese Eingabe zu verbrauchen, müssen Sie getchar() 8 Mal, 3 für "ADD", 2 für die Whitespaces und 4 für die Register aufrufen.

Jetzt möchten Sie "ADD Ri Rj" eingeben, so dass Sie denken, dass Sie getchar() 8 Mal erneut aufrufen müssen.

Der erste Aufruf von getchar() wird den abschließenden Zeilenvorschub von der vorherigen Eingabe (wenn der Benutzer Enter drückt) verbrauchen! Es wird nicht "A" konsumieren, wie Sie hoffen würden.

Als Ergebnis, wenn "END" eingegeben wird, gibt es nachfolgende Zeilenumbrüche und Zeichen von vorherigen Eingaben (falls vorhanden), die von getchar() verbraucht werden. So

, verbrauchen nur die Newline (und Ihre Schleife weiter, da Sie nicht das Newline-Zeichen verarbeiten wollen, nur um es zu konsumieren), wie folgt aus:

do { 
    ch1 = getchar(); 
    if(ch1 == '\n') 
    continue; 
    ch2 = getchar(); 
    if(ch2 == '\n') 
    continue; 
    ch3 = getchar(); 
    if(ch3 == '\n') 
    continue; 
    ch4 = getchar(); 
    if(ch4 == '\n') 
    continue; 

    if(ch1=='E' && ch2=='N'&& ch3=='D') { 
    break; 
    } 
} while(1); 
0

Sie müssen auch den Zeilenumbruch lesen. Außerdem müssen Sie stdin spülen, um überschüssige Ausgaben nach dem Scannen zu entfernen. Wenn Sie keine Zeichenfolgen oder Arrays verwenden können und die einzige Option ist, getchar zu verwenden, müssen Sie den Puffer aus 4 Zeichen nicht manuell verwalten, was nicht schön sein wird.

char ch1, ch2, ch3, ch4; 
do { 
    ch1 = getchar(); if (ch1 == '\n') continue; 
    ch2 = getchar(); if (ch2 == '\n') continue; 
    ch3 = getchar(); if (ch3 == '\n') continue; 
    ch4 = getchar(); if (ch4 != '\n') continue; 
    if (ch1 == 'E' && ch2 == 'N' && ch3 == 'D' && ch4 == '\n') break; 
} while (1); 

Was passiert, wenn Sie für die Newline nicht und stdin diese Spülung Konto:

  1. Benutzer geben ADD\n (4 Zeichen).
  2. ADD abgetastet wird, enthält ch1'A', ch2'D' enthält, ch3'D' enthält. '\n' ist in der stdin links.
  3. Nächste Iteration kommt. Der Benutzer gibt ADD\n erneut ein.
  4. Jedoch gibt es in '\n'stdin aus dem vorherigen Scan links, so ch1 enthält '\n', ch2'A' enthält, ch3'D' enthält, und es gibt D\n Überbleibsel in stdin.
+0

@Bob__ Und? Mein Code ist nicht identisch mit dem Code von OP, da der Code des OPs kaputt ist. – MarkWeston

0

Wenn Sie Daten in das Terminal eingeben beginnen, zuerst sagen Sie "ADD \ n", wird

  • A in ch1
  • D gespeichert getippt in ch2 gespeichert
  • D gespeichert ist, in ch3

und als '\ n' wird an den Puffer gesendet.Jetzt zweites Mal, wenn Sie neue Reihe von Zeichen eingeben beginnen, sagen Sie „SUB“, getchar() startet aus dem Puffer zu lesen und das ersten Zeichen es Begegnungen ist die ‚\ n‘, und so weiter, daher

  • ch1 = '\ n'
  • ch2 = 'S'
  • ch3 = 'U'

eine bessere Korrektur auf ein Problem ist eine getchar add() nach dem all drei getchar() s, die verbraucht das Extra '\ n' und wird nicht gleich gedruckt.

do{ 
    ch1=getchar(); 
    ch2=getchar(); 
    ch3=getchar(); 
    getchar(); 

if(ch1=='E' && ch2=='N'&& ch3=='D'){ 
    break; 
    } 
    printf("%c",ch1); 
    printf("%c",ch2); 
    printf("%c",ch3); 
}while(1); 
return 0; 

}