Domanda:
[C] Getchar,putchar,getch,putch?
lori.mak
2010-03-24 11:57:32 UTC
Qualcuno mi dice perfavore a cosa servono questi quatro elementi in C(la differenza tra essi e printf,scanf,fprintf,fscanf) e specialmente come si usano.
Tre risposte:
Tizio 008
2010-03-25 03:34:02 UTC
sono funzioni della libreria standard. se hai un sistema gnu/linux con tutto il necessario per la prog installato, digitando

man Funzione

dalla linea di comando hai il manualetto... (al posto di Funzione metti getch, ecc.) che spiega tutto, e tra l'altro lo trovi anche online..., per es.

http://www.opengroup.org/onlinepubs/000095399/functions/getchar.html

ma se ne trovano altri.



getch e putch non fanno parte della libreria standard del C, tipicamente sono in librerie come conio (definita nell'header conio.h) per windows, o curses/ncurses per sistemi "*nix".



getchar prende un carattere dallo standard input (stdin), bufferizzata

putchar "invia" un carattere allo standard output (stdout)



getch legge un carattere dal terminale; anche se sembra non è lo stesso, getch sottintende un terminale interattivo, getchar uno stream di caratteri che può provenire anche da file (stdin e stdout posson essere reinderizzati); dunque getch è il modo tipico (ammesso che la lib sia disponibile) per "leggere interattivamente" i tasti (e reagire man mano che vengono premuti); mentre getchar, è bufferizzata, quindi p.es., metti che nel buffer ci sia "ciao", e che siamo all'inizio del buffer, la prima getchar prende "c", ma seconda "i"... se intanto il buffer si riempie, per esempio con "mondo", diventando "ciaomondo", in ogni caso dopo la "i" otterremo la "a" ecc.



putch invia un carattere al terminale, sempre supponendo che sia un terminale interattivo, e alla posizione corrente del "cursore" (che altre apposite funzioni permettono di spostare); librerie come conio e meglio curses permettono output evoluto verso terminale, cose del tipo

http://www-uxsup.csx.cam.ac.uk/pub/doc/suse/sles9/adminguide-sles9/images/yast2_ncurses_main.png

(si tratta di una shell/terminale "dentro" una finestra grafica; quello che "fa" una lib come ncurses è quello che c'è dentro, "nel" terminale, non la finestra ecc., cioè non gli elementi strettamente grafici)



getchar e putchar sono definite nello std C89/C99; getch e putch no (librerie tipo conio o curses non sono standard C)



le funzioni printf scanf ecc. sono tutte della lib standard come da standard C89/C99.

sono funzioni più evolute.



la diff tra printf e fprintf ecc. è che la "versione" con f permette di scrivere/leggere verso un "file" qualunque aperto, mentre le altre leggono da stdin e scrivono verso stdout; si può dire che



printf(....);

sia lo stesso che

fprintf(stdout, ....);



la f "finale" sta per formatted: il primo argomento di printf e scanf (il secondo di fprintf, e fscanf) è una stringa che può contenere dei codici particolari per "dire" come formattare l'output o come leggere l'input formattato.



c'è una vaga "somiglianza" funzionale tra

putchar(carattere);

e

printf("%c", carattere);



ma mentre putchar si ferma lì, printf permette di "scrivere" (mandare in output) stringhe intere, con elementi da sostituire e rappresentare come caratteri, per esempio

printf("%.1lf + %.1lf = %.1lf\n", 2.0, 3.0, 2.0+3.0);

scrive una roba del tipo

2.0 + 3.0 = 5.0

il che vuol dire che i dati float sono stati convertiti in stringhe (rappresentazione del numero) secondo il formato specificato ovvero "lf" (long float, cioè double) ma con 1 cfra dopo la virgola

ecc. .... la ricerca del man di printf aiuta...



fprintf si comporta uguale solo che come detto il primo arg è uno stream, p.es.

FILE *f = fopen("unfile.txt", "w");

fprintf(f, "%lf + %lf = %lf%c", 3., 2., 3.+2., '\n');

fclose(f);

scrive in un file della roba (invece di scrivere \n nella stringa, ho usato %c per inserire il carattere... risultato uguale con:

fprintff, "... %lf", 3., 2., 3.+2.);

fputc('\n', f);



fputc è "lo stesso" che putchar ma con la possibilità di specificare lo stream verso cui scrivere, cioè

putchar(car);

=

fputc(car, stdout);



scanf e fscanf sono le controparti che "leggono" dal flusso, stdin nel primo caso e nel secondo come specificato dal primo argomento.

scanf(...);

è in pratica

fscanf(stdin, ....)



qui la stringa di formattazione viene usata come "guida" per leggere uno stream formattato (se il formato non corrisponde, è un problema.... :D,risolvibile e controllabile ovviamente)

p.es.

scanf("%lf", &valore);

può essere usato per leggere un double dallo stdin (dunque, spesso e volentieri, ciò consente, se non ci sono caratteri spuri nel buffer di lettura, di far inserire all'utente un numero ...)



per quanto riguarda l'uso più approfondito ti rimando ai manuali
?
2016-12-12 10:34:36 UTC
Man Putchar
BluNotte
2010-03-24 12:06:57 UTC
void putchar(int c) - scrive il carattere c su console.

int getchar() - legge un carattere da console

void putch(int c, FILE* f) - scrive il carattere c sul file f

int getc(FILE* f) - legge un carattere dal file f.



Questo gruppo di funzioni permette l'I/O non formattato e non bufferizzato. In pratica, scrivi e leggi un carattere per volta.

Invece, le altre funzioni sono formattate (la 'f' sta per formatted), cioè puoi fare input e output complessi.


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...