DOMANDA Leggere un carattere

JDany

Utente Attivo
376
20
Hardware Utente
CPU
Intel Core i5 7500
Scheda Madre
ASUS H170-Pro
Hard Disk
Seagate 1 TB
RAM
Corsair Vengeance LPX 2x8 GB
Scheda Video
NVIDIA GTX 1050 Ti
Monitor
Philips Gaming Monitor 24"
Alimentatore
Corsair CX450M
Case
Sharkoon VS4-V
Sistema Operativo
Windows 10 Pro
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,465
392
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
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.
 

JDany

Utente Attivo
376
20
Hardware Utente
CPU
Intel Core i5 7500
Scheda Madre
ASUS H170-Pro
Hard Disk
Seagate 1 TB
RAM
Corsair Vengeance LPX 2x8 GB
Scheda Video
NVIDIA GTX 1050 Ti
Monitor
Philips Gaming Monitor 24"
Alimentatore
Corsair CX450M
Case
Sharkoon VS4-V
Sistema Operativo
Windows 10 Pro
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:
 

JDany

Utente Attivo
376
20
Hardware Utente
CPU
Intel Core i5 7500
Scheda Madre
ASUS H170-Pro
Hard Disk
Seagate 1 TB
RAM
Corsair Vengeance LPX 2x8 GB
Scheda Video
NVIDIA GTX 1050 Ti
Monitor
Philips Gaming Monitor 24"
Alimentatore
Corsair CX450M
Case
Sharkoon VS4-V
Sistema Operativo
Windows 10 Pro
TI consiglio di pulire anche il buffer di input tramite fflush(stdin);.
Ancora a quel capitolo non ci sono arrivato. Sto studiando le strutture dati le unioni gli alberi.
 

Entra

oppure Accedi utilizzando