DOMANDA Leggere un carattere

JDany

Utente Attivo
461
24
CPU
Ryzen 9 3900x
Scheda Madre
ASUS H170-Pro
RAM
Corsair Vengeance LPX 2x8 GB
GPU
ZOTAC RTX 3070 TWIN EDGE OC
Monitor
Philips Gaming Monitor 24"
PSU
Corsair CX450M
Case
Sharkoon VS4-V
OS
Windows 11 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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
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
461
24
CPU
Ryzen 9 3900x
Scheda Madre
ASUS H170-Pro
RAM
Corsair Vengeance LPX 2x8 GB
GPU
ZOTAC RTX 3070 TWIN EDGE OC
Monitor
Philips Gaming Monitor 24"
PSU
Corsair CX450M
Case
Sharkoon VS4-V
OS
Windows 11 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
461
24
CPU
Ryzen 9 3900x
Scheda Madre
ASUS H170-Pro
RAM
Corsair Vengeance LPX 2x8 GB
GPU
ZOTAC RTX 3070 TWIN EDGE OC
Monitor
Philips Gaming Monitor 24"
PSU
Corsair CX450M
Case
Sharkoon VS4-V
OS
Windows 11 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.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili