La funzione scanf() non funziona più di una volta!

di il
18 risposte

La funzione scanf() non funziona più di una volta!

Allora, ricopio paro paro un esercizio già completato dal libro su cui sto studiando il C.

L'esercizio chiede di scrivere un programma che legga tre numeri interi positivi da terminale che rappresentino l'orario di partenza ( in
ore, minuti, secondi) di un volo. Poi deve leggere un quarto intero da terminale, che rappresenti (in secondi) la durata del volo. Il
programma deve calcolare l'orario di arrivo.

Il libro propone questo:
#include <stdio.h>
int main()
{
	long unsigned int Ore, Minuti, Secondi, TempoDiVolo;
	printf("%s\n", "Orario di partenza (hh, mm, ss)?");
	scanf("%ld%ld%ld", &Ore, &Minuti, &Secondi);
	printf("%s", "Tempo di volo (in sec.)?");
	scanf("%ld", &TempoDiVolo);

	Secondi = Secondi + TempoDiVolo;
	Minuti = Minuti + Secondi / 60;
	Secondi = Secondi % 60;
	Ore = Ore + Minuti / 60;
	Minuti = Minuti % 60;
	Ore = Ore % 24;

	printf("%s", "Arrivo previsto alle (hh, mm, ss): ");
	printf("%ld%c%ld%c%ld\n", Ore, ':', Minuti, ':', Secondi);

	return 0;
}
Quando lo eseguo sul terminale, mi viene chiesto da input l'orario di partenza (hh, mm, ss), allora scrivo che il mio volo è tipo alle 9:15
(9:15:0, e premo Invio), e da lì mi stampa tutti gli altri printf() nel programma senza chiedermi altri input..

Questo messaggio sarà lungo, scusate, ma ho già cercato soluzioni, ho guardato altri argomenti su più forum, e quello che dicono più spesso è di lasciar proprio perdere la scanf(), e di provare a usare fgets(), perchè uno dei problemi di scanf() è che quando premi INVIO dopo aver digitato un carattere, vengono valutati sia il carattere immesso sia INVIO, che viene messo "in coda" (cioè pronto da leggere come primo carattere d'ingresso per il prossimo scanf), quindi non avresti tempo di digitare altro, poiché c'é già INVIO in coda.

Ma allora, scusate, ma com'è che invece quest'altro programma mi funziona liscio come l'olio?

#include <stdio.h>
int main()
{
	int a;

	printf("Digita una cifra: ");
	scanf("%d", &a);
	printf("Hai digitato: %d\n", a);

	printf("Digitane un'altra: ");
	scanf("%d", &a);
	printf("Hai digitato: %d\n", a);

	printf("Digitane ancora una: ");
	scanf("%d", &a);
	printf("Ora hai digitato: %d\n", a);

	return 0;
}
Qua mi chiede diligentemente ogni cosa! Perché qua tutta la manfrina dell' "INVIO in coda" non mi succede? Non so che pensare, se sospettare che il libro scrive gli esercizi male, o se il mio compilatore è "rotto" (uso gcc e il Notepad, compilo direttamente sul terminale, per ora non uso IDE),
l'unica cosa per cui ci sformo davvero è che non posso nemmeno imparare se mi vengono insegnate male proprio le basi!
Ma posso seguire tutto paro paro al libro, convinto di seguire un Testo Sacro senza errori e poi mi trovo col file .exe lunatico??
Vi prego, datemi una mano perché ho disinstallato e reinstallato diversi IDE e pure il MinGW, convinto che avessero combinato loro qualcosa alle variabili d'ambiente o non so che... Non ci sto capendo niente


Grazie in anticipo!

18 Risposte

  • Re: La funzione scanf() non funziona più di una volta!

    Metti i tag code per il codice
  • Re: La funzione scanf() non funziona più di una volta!

    Che libro stai usando?
  • Re: La funzione scanf() non funziona più di una volta!

    E hai fatto ricerche in QUESTO forum? Ne abbiamo parlato così tante volte...

    Comunque, il primo codice, quello del libro, deve essere
    
    #include <stdio.h>
    int main()
    {
    	unsigned long int Ore, Minuti, Secondi, TempoDiVolo;
    
    	printf("Orario di partenza (hh, mm, ss)? ");
    	scanf("%ld:%ld:%ld", &Ore, &Minuti, &Secondi);
    	printf("Tempo di volo (in sec.)? ");
    	scanf("%ld", &TempoDiVolo);
    
    	Secondi = Secondi + TempoDiVolo;
    	Minuti = Minuti + Secondi / 60;
    	Secondi = Secondi % 60;
    	Ore = Ore + Minuti / 60;
    	Minuti = Minuti % 60;
    	Ore = Ore % 24;
    
    	printf("Arrivo previsto alle (hh:mm:ss): ");
    	printf("%ld:%ld:%ld\n", Ore, Minuti, Secondi);
    
    	return 0;
    }
    
  • Re: La funzione scanf() non funziona più di una volta!

    Se vuoi un consiglio, lascia perdere quelli che ti dicono di lasciare perdere scanf: leggi la documentazione di questa funzione, ma leggila tutta tutta - comprese quelle righe noiose che non vuole leggere nessuno. Fai vari test di tuo, provando tutte le combinazioni che ti vengono in mente, e poi capirai come funziona e perché è stata progettata così. Come dice oregon, ci sono tantissimi thread che ne parlano
  • Re: La funzione scanf() non funziona più di una volta!

    Andrea Quaglia ha scritto:


    Che libro stai usando?
    Non è proprio un libro, è un file PDF -non proprio recentissimo- della LIA DEIS Università di Bologna, questo è il link:
    http://lia.disi.unibo.it/Courses/FondT-1011-ELT/materiale.html

    Il file è lo 04. Istruzioni Semplici, l'esercizio con soluzione proposta è alle pag 31/32, quindi verso la fine del file.
  • Re: La funzione scanf() non funziona più di una volta!

    oregon ha scritto:


    E hai fatto ricerche in QUESTO forum? Ne abbiamo parlato così tante volte...

    Comunque, il primo codice, quello del libro, deve essere
    
    #include <stdio.h>
    int main()
    {
    	unsigned long int Ore, Minuti, Secondi, TempoDiVolo;
    
    	printf("Orario di partenza (hh, mm, ss)? ");
    	scanf("%ld:%ld:%ld", &Ore, &Minuti, &Secondi);
    	printf("Tempo di volo (in sec.)? ");
    	scanf("%ld", &TempoDiVolo);
    
    	Secondi = Secondi + TempoDiVolo;
    	Minuti = Minuti + Secondi / 60;
    	Secondi = Secondi % 60;
    	Ore = Ore + Minuti / 60;
    	Minuti = Minuti % 60;
    	Ore = Ore % 24;
    
    	printf("Arrivo previsto alle (hh:mm:ss): ");
    	printf("%ld:%ld:%ld\n", Ore, Minuti, Secondi);
    
    	return 0;
    }
    
    Funziona!

    Grazie, sì, pardòn, i tag ecc mo' me li imparo ad usare..

    Comunque sì, ho dato un'occhiata a questo forum, c'è un argomento "Funzione scanf() che viene saltata", del 2015, e al tizio che chiedeva aiuto hai risposto sempre tu, ma non ci ho capito molto del codice sorgente suo (pare evidente che sono proprio nuovo in materia, ho appena iniziato a studiare il C), ho creduto fosse meglio intasare il Forum col problema mio perché a 'sto punto pensavo che fosse un problema di compilazione, cioè, se scrivo un programma come nel libro e l'eseguibile non funziona...

    Ma qual era il problema? Non può essere una cosa banale come sostituire
    printf("%s", "Tempo di volo?");
    con
    printf("Tempo di volo?");
    , o la punteggiatura ":" tra i %ld a scanf()...

    ...Cos'è che lo bloccava? "long unsigned int" anziché "unsigned long int"? E perchè?
    Grazie
  • Re: La funzione scanf() non funziona più di una volta!

    E' proprio la punteggiatura che tu inserisci ma che non è prevista dalla scanf.

    Comunque, butta quel pdf (e tutti gli altri se sono di questo tipo ...).
  • Re: La funzione scanf() non funziona più di una volta!

    Petulanzio ha scritto:



    Il libro propone questo:

    Ciao,
    a me funziona perfettamente.
  • Re: La funzione scanf() non funziona più di una volta!

    antragorn ha scritto:


    Petulanzio ha scritto:



    Il libro propone questo:

    Ciao,
    a me funziona perfettamente.
    Cosa inserisci?
  • Re: La funzione scanf() non funziona più di una volta!

    oregon ha scritto:


    E' proprio la punteggiatura che tu inserisci ma che non è prevista dalla scanf.

    Comunque, butta quel pdf (e tutti gli altri se sono di questo tipo ...).
    ...Ah.
    A questo punto è inutile che lo ri-cito ancora, ma giusto per capire, il PDF diceva che se specifico a scanf() che voglio per esempio due %d:
    scanf("%d%d", &x, &y);
    quello che metto in mezzo alle due cifre chieste da scanf(), come una punteggiatura o uno spazio, non da problemi perché viene considerato un separatore..
  • Re: La funzione scanf() non funziona più di una volta!

    Lo spazio si ma non tutto...
  • Re: La funzione scanf() non funziona più di una volta!

    Weierstrass ha scritto:


    Se vuoi un consiglio, lascia perdere quelli che ti dicono di lasciare perdere scanf: leggi la documentazione di questa funzione, ma leggila tutta tutta - comprese quelle righe noiose che non vuole leggere nessuno. Fai vari test di tuo, provando tutte le combinazioni che ti vengono in mente, e poi capirai come funziona e perché è stata progettata così. Come dice oregon, ci sono tantissimi thread che ne parlano
    Ok, grazie.
  • Re: La funzione scanf() non funziona più di una volta!

    oregon ha scritto:


    Lo spazio si ma non tutto...
    Ok, chiaro, mi documenterò su 'sta scanf(), grazie.
    ...No, aspetta, ma perché invece hai invertito l'ordine da "long unsigned int" a "unsigned long int"? Solo per maggiore efficienza o era fondamentale?
  • Re: La funzione scanf() non funziona più di una volta!

    Sono equivalenti ...

    Ma l'unsigned o il signed si scrive normalmente prima del tipo di dato, come in inglese...
Devi accedere o registrarti per scrivere nel forum
18 risposte