2013-10-14 9 views
5

Czytam K & R Język programowania C i stały się zdezorientowane na putchar i getchar. Zrobiłem program, w którym wpisujesz 10 znaków i program wypisuje je na ekranie.Putchar i Getchar w 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; 
} 

spodziewałem się dostać wyjście takiego:

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

... i tak 10 razy, ale to jest wyjście mam: (I zatrzymał się po wpisaniu 2 znaków)

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

Nie wiem, dlaczego mój znak wejściowy jest łączony ze stałym ciągiem i jako wynik.

Ponadto, nie jestem zbyt pewien, dlaczego int są używane do przechowywania znaków.

Odpowiedz

4
putchar(ch); 

po prostu drukuje pojedynczy znak, a następujący printf kontynuuje w tym samym wierszu. Wystarczy dodać:

putchar('\n'); 

zaraz po putchar(ch);, który będzie wyraźnie uruchomić nową linię przed printf jest wykonywany. Dodatkowo należy również wziąć '\n' od wejścia, która stoi tam po wpisaniu znaku:

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

Dzięki za odpowiedź, ale kod nadal nie działa, "Wprowadź pojedynczy znak >>" jest nadal drukowany dwukrotnie, gdy nie powinno być. Jeśli spojrzysz na mój główny wpis i ostatni blok kodu, zobaczysz w drugiej linii, co mam na myśli, znak char został dołączony do napisu "Wpisz pojedynczy znak >>", a następnie "Wprowadź pojedynczy znak >> "ciąg jest natychmiast drukowany na ekranie ponownie. –

+0

@CSStudent: Rozumiem. Sprawdź teraz moją odpowiedź :) – LihO

4

Nie drukujesz nowej linii. Po putchar(ch); należy użyć putchar('\n');, aby wydrukować nową linię.

+1

Dzięki za odpowiedź, ale kod nie zadziała, „Enter pojedynczy znak >>” nadal jest drukowany dwukrotnie, kiedy powinnam nie bądź. Jeśli spojrzysz na mój główny wpis i ostatni blok kodu, zobaczysz w drugiej linii, co mam na myśli, znak char został dołączony do napisu "Wpisz pojedynczy znak >>", a następnie "Wprowadź pojedynczy znak >> "ciąg jest natychmiast drukowany na ekranie ponownie. –

2

terminalu użytkownika może działać w trybach kanonicznych i niekanonicznych. Domyślnie działa w trybie kanonicznym, co oznacza, że ​​standardowe wejście jest dostępne dla programu linia po linii (nie symbol po symbolu). W pytaniu użytkownik wprowadza coś (niech będzie litera "a", 0x61 w hex) i popycha enter (znak nowego wiersza "0x0A" w hex). Stół Ascii to here. Ta akcja daje dwa symbole dla programu. Jak wspomniano w człowieku getchar() odczytuje go symbol po symbolu. Więc pętla iteruje dwa razy dla jednej postaci. Aby zobaczyć, co dzieje się stosowania następujący program (+ pętla wyjście licznika, wyjście + Kod znaków):

#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; 
} 

wyjściowa:

┌─(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 

Tak Program pobiera dwa symbole i drukuje je. Nowy symbol linii nie jest widoczny. Tak więc w pytaniu użytkownika widzimy jedną dziwną dodatkową linię. Szczegółowy opis różnych trybów terminali oraz sposób ich dostosowywania można znaleźć pod adresem here.

Narzędzie stty może być przydatne podczas pracy z opcjami terminala ("icanon" informuje, czy tryb kanoniczny używa terminala, czy nie).
I o przechowywaniu znaków jako int w wynikach getchar() - zobacz mój temat dla podobnego tematu: answer.

0

Pętla w parzystym czasie, getchar() nie pobiera danych wejściowych z klawiatury, ale jest pobierana z poprzedniego wprowadzonego trafienia, więc zauważyłbyś również, że pętla jest wykonywana tylko 5 razy. Musisz więc wyczyścić bufor, tj. Nacisnąć przycisk wprowadzony, aby nowy znak mógł zostać wprowadzony w ch.

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

Nie wiem, czy idealne, ale to działało:

#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

To jest złe. Twój pierwszy 'getchar()' będzie jadł dane wejściowe użytkownika, a 'ch' otrzyma tylko znak nowej linii – Cyril

+1

widzę, dzięki :) –