2013-10-14 13 views
5

Sto leggendo K & R's The C Programming Language e sono diventato confuso su putchar e getchar. Ho creato un programma in cui inserisci 10 caratteri e il programma li stampa di nuovo sullo schermo.Putchar e 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; 
} 

mi aspettavo di ottenere un output simile a questo:

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

... e così via per 10 volte, ma questo è l'output che ho ottenuto: (mi sono fermato dopo l'ingresso 2 caratteri)

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

non sono sicuro del motivo per cui il mio carattere di input viene combinato con la stringa fissa e viene emesso.

Inoltre, non sono troppo sicuro del perché vengono utilizzati i caratteri per memorizzare i caratteri.

risposta

4
putchar(ch); 

stamperà solo singolo carattere e il successivo printf continua all'interno della stessa linea. Basta aggiungere:

putchar('\n'); 

subito dopo putchar(ch); che prenderà il via in modo esplicito la nuova linea prima della printf viene eseguita. Inoltre si dovrebbe anche prendere '\n' dall'ingresso, che rimane lì dopo aver immesso il carattere:

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

Grazie per la risposta ma il codice continua a non funzionare, "Inserisci un singolo carattere >>" viene ancora stampato due volte quando non dovrebbe essere. Se guardi il mio post principale e l'ultimo blocco di codice puoi vedere sulla seconda riga cosa intendo, il carattere è stato aggiunto alla stringa "Inserisci un singolo carattere >>" e quindi "Inserisci un singolo carattere >> "la stringa viene immediatamente stampata sullo schermo. –

+0

@CSStudent: vedo. Controlla la mia risposta ora :) – LihO

4

Non si sta stampando una nuova riga. Dopo putchar(ch); è necessario utilizzare putchar('\n'); per stampare una nuova riga.

+1

Grazie per la risposta, ma il codice non funziona ancora, "Inserire un singolo carattere >>" è ancora stampato due volte quando si shouldn essere. Se guardi il mio post principale e l'ultimo blocco di codice puoi vedere sulla seconda riga cosa intendo, il carattere è stato aggiunto alla stringa "Inserisci un singolo carattere >>" e quindi "Inserisci un singolo carattere >> "la stringa viene immediatamente stampata sullo schermo. –

2

terminale utente può operare in modalità canoniche e non canoniche. Di default funziona in modalità canonica e ciò significa che l'input standard è disponibile per un programma riga per riga (non simbolo per simbolo). In questione l'utente inserisce qualcosa (lascia che sia la lettera 'a', 0x61 in esadecimale) e preme Invio (carattere di nuova riga '0x0A' in esadecimale). Il tavolo Ascii è here. Quindi questa azione dà due simboli a un programma. Come menzionato in man getchar() lo legge simbolo per simbolo. Quindi il ciclo itera due volte per un carattere. Per vedere che cosa sta succedendo utilizzare il seguente programma (+ ciclo uscita del contatore, + carattere uscita del codice):

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

uscita:

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

Così programma ottiene due simboli e li stampa. E il nuovo simbolo di linea non è visibile. Quindi nella domanda l'utente vede una strana linea aggiuntiva. La descrizione dettagliata su diverse modalità di terminale e come effettuare le sue regolazioni può essere trovata here.

Anche l'utilità stty può essere utile mentre si lavora con le opzioni del terminale ("icanon" indica se il terminale utilizza la modalità canonica oppure no).

E riguardo la memorizzazione di caratteri come int nell'output di getchar() - vedere il mio answer per argomenti simili.

0

Loop sul numero pari di tempo, getchar() non riceve l'input dalla tastiera, ma è preso dal colpo inserito in precedenza, quindi si sarebbe anche notato che il ciclo viene eseguito solo 5 volte. Quindi è necessario cancellare il buffer, cioè inserito, in modo che il nuovo carattere possa essere inserito nello ch.

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

Non sono sicuro se l'ideale, ma questo ha funzionato:

#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

Questo è sbagliato. Il tuo primo 'getchar()' mangerà l'input dell'utente, e 'ch' otterrà solo un carattere di nuova riga – Cyril

+1

vedo, grazie :) –