[DOMANDA] Leggere un carattere

  • Il Forum di Tom's Hardware, la più grande community dedicata all'Hardware e all'Informatica. Iscriviti Ora!
#1
Salve. Ho trovato un problema che non avevo mai incontrato.

Codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct{
    const char c;
}Char;

int cToi(char);

int main(int argc, char *argv[]){   
    Char a, b;
    int n1, n2;
    printf("%s","Inserisci un numero: ");
    scanf("%c", &a.c);
    n1 = cToi(a.c);
    getchar();                                // Senza questo non mi fa leggere un altro char
    printf("%s","Inserisci un numero: ");
    scanf("%c", &b.c);
    n2 = cToi(b.c);
    printf("Somma: %d", n1+n2);
    return 0;
}

int cToi(char a){
    int b = a;
    return b-48;
}
Come ho scritto nel programma, senza "getchar();" prima della prossima scanf non mi fa leggere da tastiera nulla, termina il programma direttamente.
Perché succede questo? E' la prima volta che incontro un problema del genere.
 

rodhellas

Utente Attivo
1,415
377
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#2
Succede perchè alla prima scanf nel buffer inserisci un carattere più il carattere di invio ('\n'). Quindi alla seconda scanf lui guarda nel buffer e tira fuori in automatico '\n'. Con il getchar() risolvi questo problema.
Altra soluzione sarebbe mettere scanf("\n%c", &b.c); cosi che la scanf legga e scarti il \n e poi legga correttamente il carattere.
 
#3
Succede perchè alla prima scanf nel buffer inserisci un carattere più il carattere di invio ('\n'). Quindi alla seconda scanf lui guarda nel buffer e tira fuori in automatico '\n'. Con il getchar() risolvi questo problema.
Altra soluzione sarebbe mettere scanf("\n%c", &b.c); cosi che la scanf legga e scarti il \n e poi legga correttamente il carattere.
Ah non lo sapevo.
Grazie per questa informazione. :brindiamo:
 

Discussioni Simili