2013-10-14 19 views
5

Ich lese K & Rs Die C-Programmiersprache und sind auf putchar und getchar verwirrt worden. Ich habe ein Programm erstellt, in dem Sie 10 Zeichen eingeben und das Programm druckt sie auf dem Bildschirm aus.Putchar und Getchar in C

#include <stdio.h> 

int main() 
{ 
    int i; 
    int ch; 
    for(i = 0; i < 10; i++) 
    { 
     printf("Enter a single character >> "); 
     ch = getchar(); 
     putchar(ch); 
    } 

    return 0; 
} 

ich erwartet, dass eine Ausgabe wie folgt zu erhalten:

Enter a single character >> a 
a 
Enter a single character >> b 
b 

... und so weiter 10-mal, aber das ist der Ausgang bekam ich: (Ich hörte nach der Eingabe 2 Zeichen)

Enter a single character >> a 
aEnter a single character >> 
Enter a single character >> b 
bEnter a single character >> 
Enter a single character >> 

nicht sicher, warum mein Eingabezeichen mit der festen Zeichenfolge kombiniert und ausgegeben wird.

Auch ich bin mir nicht sicher, warum Ints verwendet werden, um Zeichen zu speichern.

Antwort

4
putchar(ch); 

druckt nur einzelne Zeichen und die folgende printf weiterhin innerhalb der gleichen Zeile. Fügen Sie einfach:

putchar('\n'); 

direkt nach putchar(ch);, die ausdrücklich die neuen Zeile beginnen, bevor die printf ausgeführt wird. Zusätzlich sollen Sie auch '\n' vom Eingang nehmen, die dort bleiben, nachdem Sie die Zeichen eingeben:

for(i = 0; i < 10; i++) 
{ 
    printf("Enter a single character >> "); 
    ch = getchar(); 
    getchar();  // <-- "eat" new-line character 
    putchar(ch); 
    putchar('\n'); // <-- start new line 
} 
+1

Danke für die Antwort, aber der Code funktioniert immer noch nicht, "Geben Sie ein einzelnes Zeichen >>" wird immer noch zweimal gedruckt, wenn es nicht sein sollte. Wenn Sie sich meinen Hauptpost und den letzten Codeblock ansehen, können Sie in der zweiten Zeile sehen, was ich meine, das Zeichen a wurde mit der Zeichenkette "Gib ein einzelnes Zeichen >>" verbunden und dann "Gib ein einzelnes Zeichen ein >>" "Die Zeichenfolge wird sofort erneut auf dem Bildschirm gedruckt. –

+0

@CSStudent: Ich verstehe. Überprüfen Sie meine Antwort jetzt :) – LihO

4

Sie drucken keine neue Zeile. Nach putchar(ch); sollten Sie putchar('\n'); verwenden, um eine neue Zeile zu drucken.

+1

Danke für die Antwort, aber der Code immer noch nicht funktioniert, „ein einzelnes Zeichen eingeben >>“ noch zweimal gedruckt wird, wenn es shouldn nicht sein. Wenn Sie sich meinen Hauptpost und den letzten Codeblock ansehen, können Sie in der zweiten Zeile sehen, was ich meine, das Zeichen a wurde mit der Zeichenkette "Gib ein einzelnes Zeichen >>" verbunden und dann "Gib ein einzelnes Zeichen ein >>" "Die Zeichenfolge wird sofort erneut auf dem Bildschirm gedruckt. –

2

Benutzerterminal in kanonischen und nicht-kanonischen Modi betrieben werden. Standardmäßig arbeitet es im kanonischen Modus und das bedeutet, dass die Standardeingabe für ein Programm Zeile für Zeile verfügbar ist (nicht Symbol für Symbol). In Frage stellt der Benutzer etwas ein (sei der Buchstabe "a", 0x61 in hex) und drückt Enter (neues Zeilenzeichen "0x0A" in hexadezimal). Ascii Tabelle ist here. Diese Aktion gibt also einem Programm zwei Symbole. Wie in man getchar() erwähnt, liest es symbolweise. Also wiederholt sich die Schleife zweimal für ein Zeichen. Um zu sehen, was bei der Verwendung wird das folgende Programm (+ Schleifenzähler Ausgang, + Zeichencode-Ausgabe):

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    int i; 
    char ch; 
    for(i = 0; i < 10; i++) 
    { 
    printf("Enter a single character %d >>", i); 
    ch = getchar(); 
    printf("Ch=0x%08X\n", ch); 
    /*putchar(ch);*/ 
    } 

    return 0; 
} 

Ausgang:

┌─(02:01:16)─([email protected])─(~/tmp/getchar) 
└─► gcc -o main main.c; ./main 
Enter a single character 0 >>a 
Ch=0x00000061 
Enter a single character 1 >>Ch=0x0000000A 
Enter a single character 2 >>b 
Ch=0x00000062 
Enter a single character 3 >>Ch=0x0000000A 
Enter a single character 4 >>^C 

So Programm bekommt zwei Symbole und druckt sie. Und das neue Liniensymbol ist nicht sichtbar. Also in der Frage Benutzer sehen eine seltsame zusätzliche Zeile. Detaillierte Beschreibung der verschiedenen Terminal-Modi und wie Sie ihre Anpassungen vornehmen können finden Sie unter here.

Auch stty Dienstprogramm kann nützlich sein, während der Arbeit mit Terminal-Optionen ("icanon" sagt, wenn Terminal kanonischen Modus verwenden oder nicht).

Und über Speichern von Zeichen als int in getchar() -Ausgabe - siehe meine answer für ähnliche Thema.

0

Schleife auf der geraden Anzahl der Zeit, getchar() nimmt keine Eingabe von der Tastatur, aber es ist aus dem vorherigen eingegebenen Treffer genommen, so dass Sie auch bemerkt haben, dass die Schleife nur 5 mal ausgeführt wird. Sie müssen also den Puffer löschen, d. H. Gedrückt eingeben, so dass ein neues Zeichen in ch eingegeben werden kann.

for (i = 0; i < 5; i++) 
    { 
     printf("\nEnter a single character >> "); // new line 
     ch = getchar(); 
     while (getchar() != '\n'); //Clearung buffer. 
     putchar(ch); 
    } 
0

Nicht sicher, ob ideal, aber das funktionierte:

#include <stdio.h> 
    int main() 
    { 
     int i; 
     int ch; 
     for(i = 0; i < 10; i++) 
     { 
      printf("Enter a single character >> "); 
      getchar(); 
      ch=getchar(); 
      putchar(ch); 
     } 

     return 0; 
     } 
+0

Das ist falsch. Ihre erste 'getchar()' wird die Benutzereingabe zu essen, und 'ch' wird nur eine neue Zeile Zeichen – Cyril

+1

ich sehe, danke :) –