Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    11

    [C] Programma termina senza farmi inserire il carattere

    codice:
    #include <stdio.h>
     int main() 
    {
     int a; 
    char b; 
    printf("Inserisci un numero compreso tra 1 a 25\n"); 
    scanf("%d", &a); 
    printf("Inserisci un carattere\n"); 
    scanf("%c", &b); 
    return 0; 
    }
    A video mi appare questo dopo aver digitato il numero:

    Inserisci un numero comrpeso tra 1 e 25
    4
    Inserisci un carattere

    Premi un tasto per continuare....

    Dove sbaglio?

  2. #2
    Ti appare questo perchè è esattamente questo ciò che il tuo programma fa!
    Prima prende un numero intero e lo memorizza nella variabile a, poi prende un carattere e lo memorizza nella variabile b, infine torna 0, che significa che l'applicazione è terminata correttamente.
    Se vuoi che faccia altro devi scriverlo

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include <stdio.h>
    int main() 
    {
    	int a; 
    	char b; 
    	printf("Inserisci un numero compreso tra 1 a 25\n"); 
    	scanf("%d", &a); 
    	while(getchar() != '\n');
    	printf("Inserisci un carattere\n"); 
    	scanf("%c", &b);
    	while(getchar() != '\n');
    	return 0; 
    }
    o meglio
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    int main() 
    {
    	char buf[100];
    	int a; 
    	char b; 
    	printf("Inserisci un numero compreso tra 1 a 25\n"); 
    	fgets(buf, 100, stdin);
    	a = atoi(buf);
    	printf("Inserisci un carattere\n"); 
    	fgets(buf, 100, stdin);
    	b = buf[0];
    	return 0; 
    }
    Ti appare questo perchè non pulisci il buffer!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    11
    Originariamente inviato da MegaAlchimista
    Ti appare questo perchè è esattamente questo ciò che il tuo programma fa!
    Prima prende un numero intero e lo memorizza nella variabile a, poi prende un carattere e lo memorizza nella variabile b, infine torna 0, che significa che l'applicazione è terminata correttamente.
    Se vuoi che faccia altro devi scriverlo
    si ma io ho chiesto di inserire il carattere da tastiera ma non me lo fa inserire, mi stampa solo la scritta a video e termina il programma automaticamente.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da Tudor
    si ma io ho chiesto di inserire il carattere da tastiera ma non me lo fa inserire, mi stampa solo la scritta a video e termina il programma automaticamente.
    Non pulisci il buffer! vedi sopra che ho già postato il codice!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    11
    Originariamente inviato da Scara95
    Non pulisci il buffer! vedi sopra che ho già postato il codice!
    Funziona grazie mille, ma perchè fa così?

  7. #7
    La prima scanf legge solo i caratteri relativi al numero, lasciando nel buffer di lettura gli eventuali altri caratteri inseriti, compreso quindi il ritorno a capo (\n). La seconda scanf legge quindi il primo di questi caratteri "avanzati" (il \n se non hai inserito altro dopo il numero), ed è per questo che il programma termina senza richiedere altri input.
    La soluzione è svuotare il buffer di input o leggere solo righe intere e gestirsele poi con le funzioni di conversione da stringa (come mostrato da Scara95).
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    11
    Originariamente inviato da MItaly
    La prima scanf legge solo i caratteri relativi al numero, lasciando nel buffer di lettura gli eventuali altri caratteri inseriti, compreso quindi il ritorno a capo (\n). La seconda scanf legge quindi il primo di questi caratteri "avanzati" (il \n se non hai inserito altro dopo il numero), ed è per questo che il programma termina senza richiedere altri input.
    La soluzione è svuotare il buffer di input o leggere solo righe intere e gestirsele poi con le funzioni di conversione da stringa (come mostrato da Scara95).
    quindi il problema era il \n?

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Già, ed eventualmente altri caratteri se avessi inserito una stringa tipo:
    12baujfbui
    oppure
    14 afjd

    Un metodo alternativo è anche utilizzare:
    codice:
    fflush(stdin);
    Ma non funziona su tutti i sistemi operativi quindi lo sconsiglio fortemente!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Originariamente inviato da Tudor
    quindi il problema era il \n?
    Non inteso come lo \n che hai messo tu nei tuoi printf, ma dal fatto che quando esegui il programma dopo aver inserito il numero premi invio, e lui nel buffer salva '\n' quindi quando poi fai la scanf lui automaticamente cerca un carattere nel buffer, trova quello, e non ti richiede input

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.