Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 17 di 47
  • livello principiante
Indice lezioni

Prime operazioni di Input/Output

Gestire le operazioni di invio e di visualizzazione dati: getchar, getchar, printf, scanf.
Gestire le operazioni di invio e di visualizzazione dati: getchar, getchar, printf, scanf.
Link copiato negli appunti

In questa lezione esaminiamo gli strumenti che il linguaggio C ci offre per operare su input e output. In particolare vediamo come effettuare semplici stampe a video a partire dalle informazioni inserite con la tastiera.

Per fare questo dobbiamo includere il file <stdio.h> che mette a disposizione alcune funzioni predefinite per eseguire la lettura da un dispositivo di input (es. tastiera) o scrittura su un dispositivo di output (es. video); le funzioni di cui parleremo sono getchar(), printf() e scanf().

getchar

La prima funzione che incontriamo è la getchar, il cui compito è quello di leggere un carattere per volta dalla tastiera; qui di seguito presentiamo un programma che conta il numero di volte che si è digitato un carattere (per interrompere il programma premere CtrL+D, = EOF).

#include
main()
{
int ch, i = 0;
while((ch = getchar()) != EOF) i++;
printf("%d \n", i);
}

putchar

La funzione immediatamente seguente (e complementare) è la putchar(), che legge un carattere alla volta e lo stampa a video; viene presentata nel seguente programma che converte ogni carattere inserito nell'equivalente lettera maiuscola (grazie alla funzione toupper().

#include <ctype.h> /* Per la definizione di toupper */
#include <stdio.h> /* Per la definizione di getchar, putchar ed EOF */
main()
{
int ch;
while((ch = getchar()) != EOF)
putchar(toupper(ch));
}

printf

L'istruzione per stampare a video più usata è la printf(), che ci permette di controllare ciò che viene stampato, nel senso che permette di decidere cosa stampare ed in quale forma. La struttura di printf è la seguente:

int printf(char *formato, lista argomenti ...)

Stampa sullo stdout (il video o la console in questo caso) la lista di argomenti conformemente alla stringa di formato specificata. La funzione ritorna il numero di caratteri stampanti. La stringa di formato ha due tipi di argomenti:

  • caratteri ordinari - questi vengono copiati nell'output;
  • specificazioni di conversione - contraddistinte dal carattere percentuale "%" e da un carattere che specifica il formato con il quale stampare le variabili presenti nella lista di argomenti.

La tabella seguente mostra i possibili formati che possono essere usati per formattare le variabili; tali considerazioni si applicano anche al comando scanf();

Stringa di controllo Cosa viene stampato
%d, %i Intero decimale
%f Valore in virgola mobile
%c Un carattere
%s Una stringa di caratteri
%o Numero ottale
%x, %X Numero esadecimale
%u Intero senza segno
%f Numero reale (float o double)
%e, %E Formato scientifico
%% Stampa il carattere %

È possibile inserire, tra il simbolo % e l'identificativo del formato, una delle seguenti voci:

  • Segno meno (-), esegue la giustificazione a sinistra;
  • Un numero intero, specifica l'ampiezza del campo;
  • m.d, dove m è l'ampiezza del campo e d è la precisione del numero; usato generalmente per le stringhe o per un numero di tipo reale.

Quindi facciamo degli esempi per far capire meglio l'uso di printf():

int x = 10;
printf("Il numero è %d \n", x);
/* l'output a video è "Il numero è 10" */
printf("%-2.3f \n", 24.392734);
/* l'output a video è 24.393 */
printf("IVA = 20%% \n");
/* l'output a video è, "IVA = 20%" */

Altri linguaggi che usano printf(), oltre al C, sono il C++, per il quale, però esiste anche il comando nativo cout, ed il PHP, nel quale si comporta in modo analogo a quello del C.

All'intero di quello che verrà stampato notiamo spesso il simbolo "\n" che, come avrete intuito serve per andare a capo; tale simbolo viene chiamato sequenza di escape. Le sequenze di escape servono per rappresentare quei caratteri "speciali" presenti nella codifica ASCII e che non stampano nulla a video, ma permetto di introdurre all'interno di ciò che verrà stampato eventuali spaziature. Le sequenze di escape iniziano con il carattere backslash () e sono interpretate come un singolo carattere.

Tipo di opzione Descrizione
\n Ritorno a capo
\t Tabulazione orizzontale
\b Tabulazione verticale
\a Torna indietro di uno spazio
\f Salto pagina

scanf

La funzione scanf() serve per leggere dallo stdin (generalmente la tastiera) una sequenza di caratteri (lettere o cifre) che verranno memorizzate all'interno di opportune variabili. Scanf è, quindi, definita come segue:

int scanf(char *formato, lista argomenti ...)

Da far notare che scanf(), oltre a poter leggere stringhe di testo, e non un solo carattere alla volta come getchar(), permette di leggere più variabili contemporaneamente, se queste sono specificate nella lista degli argomenti.

A differenza di printf(), però la variabile deve essere messa preceduta dal simbolo &, perché in realtà tra gli argomenti non dobbiamo passare il nome della variabile, ma il suo indirizzo, cosa che può essere fatta tranquillamente utilizzando un puntatore (ed ecco il perché del &, simbolo che serve ad ottenere l'indirizzo del puntatore; tratteremo i puntatori nel capitolo 13).

#include <stdio.h>
int main()
{
int i;
scanf("%d \n", &i);
printf("%d \n", i);
}

Questo semplice programma sopra esposto serve solamente per leggere un numero da tastiera e ristamparlo a video; avrete notato che è possibile usare gli specificatori di conversione anche per scanf(), che, quindi, si comporta in modo molto simile a printf().

Una piccola particolarità limitatamente all'uso delle stringhe e degli array con la funzione scanf(), è la seguente:

char stringa[100];
scanf("%s", stringa);

In questo caso è possibile omettere il simbolo & che richiama l'indirizzo del puntatore, ed usare, invece, il nome della variabile, perché il nome di un array corrisponde all'indirizzo di partenza dell'array stesso.

Esempio Pratico

(Visualizza il sorgente completo)

Le funzioni di base di input/output sono ampiamente utilizzate all'interno del programma. Ad esempio, il menu iniziale viene stampato usando printf() e all'utente è permesso scegliere l'operazione che desidera utilizzando scanf().

71  printf(" #######################n");
72  printf(" # RUBRICA EASY v1.0 #n");
73  printf(" #######################nn");
74  printf(" 1) VISUALIZZA CONTATTOnn");
75  printf(" 2) AGGIUNGI CONTATTOnn");
76  printf(" 3) MODIFICA CONTATTOnn");
77  printf(" 4) RIMUOVI CONTATTOnn");
78  printf(" 5) LEGGI CONTATTI DA FILEnn");
79  printf(" 6) SALVA CONTATTI SU FILEnn");
80  printf(" 0) ESCInnnn");
81  printf(" la tua scelta > ");
82
83  // Aspetto scelta dell'utente
84  scanf ("%i", &scelta);
85  scelta = (int)scelta; 

Ti consigliamo anche