Salve, sono nuovo e da pochi giorni sto studiando come primo linguaggio il C, quindi iniziando praticamente da 0.
Stavo seguendo il mio testo fino a quando non mi son imbattuto in un programma, copiato tale e quale dal libro, che però funzionava in modo errato.
Questo programma da la rappresentazione ascii di un carattere immesso e converte i caratteri minuscoli in maiuscoli.
int main() {
char c, cm;
printf("Inserire un carattere - # Termina il programma\n");
scanf("%c",&c);
while(c!='#')
{
printf("Il codice ASCII del carattere %c e' %d\n", c, c);
if(c>='a' && c<='z')
{
cm = c - ('a'-'A');
printf("La lettera maiuscola per %c e' %c e il suo codice ASCII e' %d\n", c, cm, cm);
}
printf("Inserire un carattere - # Per terminate il programma\n");
scanf("%c",&c);
}
return 0;
}
Provando ad eseguirlo, quel che succede è che l'ultimo scanf, quello nel while viene saltato a ogni iterazione e viene eseguito ogni 2 cicli.
Ho letto un po' su internet e ho letto che è dovuto allo standard input, buffering etc
(non ne ho capito tanto a dire il vero su cosa siano, il testo non ha mai menzionato questo funzionamento, a parte citare semplicemente che lo standard input può essere costituito dalla tastiera)
che lasciano uno \n nello standard input che, ragionandoci, sembra che venga poi eliminato dopo una seconda iterazione per qualche motivo..
Infatti il risultato del codice è:
Inserire un carattere - # Termina il programma
a
Il codice ASCII del carattere a e' 97
La lettera maiuscola per a e' A e il suo codice ASCII e' 65
Inserire un carattere - # Per terminate il programma
Il codice ASCII del carattere
e' 10
Inserire un carattere - # Per terminate il programma
Ho anche letto che si può usare una funzione fflush(stdin); per pulire il buffer, e così ho provato a metterla prima dell'ultimo scanf e in effetti così funziona.
Tuttavia leggo anche che in molti sconsigliano di fare questo tipo di utilizzo per questa funzione..
Avere suggerimenti, idee, alternative? Grazie.