Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [C] Printf() e cicli

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    1

    [c] Printf e cicli

    Saluti a tutti

    Poco più di un mese che mi sono iscritto ad ingegneria informatica, e da qui mi sono dovuto rimboccare le maniche per imparare a programmare...
    In facoltà hanno deciso di insegnare il linguaggio C e con questo devo fare i conti...

    Premesse a parte, la funzione printf mi sta causando non pochi problemi...
    in particolare, se viene inserita all'interno di un ciclo, ad ogni iterazione del ciclo viene stampata due volte... e non riesco a capire perchè!
    Come IDE e compilatore sto usando Data::block e minGW, sistema operativo XP e ovviamente il compilatore lavora per generare eseguibili per windows.

    Vi scrivo il codice più semplice che ho fatto ma che propone comunque questo problema:

    #include <stdio.h>

    main()
    {
    char x;

    x='n';
    while (x!='y'){
    printf ("vuoi uscire dal programma? Y/N\n");
    scanf ("%c",&x);
    }
    }
    e il problema che si verifica è questo:




    link all'immagine

    La domanda è:
    Perchè???

    Potete darmi una mano?

    Grazie!
    ciao!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Inserisci una

    getchar();

    dopo la scanf ...

    Il problema e' dovuto al fatto che il programma legge da tastiera il carattere della risposta e il return ... ma essendo previsto un solo carattere nella x, il secondo viene prelevato al secondo giro ...

    La getchar "pulisce" il buffer ed elimina il return ...

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    bhè...anche io sono nuovo...ma penso che dovrei riuscire a risolvere il problema...secondo me si tratta di un problema nella scanf...xkè in genere la scanf legge tutti i caratteri compreso l'invio...quindi x eliminare il problema basta inserire nella scanf un ulteriore %c che "mangierà" il carattere "invio"...prova quindi a scrivere:
    codice:
    scanf ("%c%c", &x);

  4. #4
    Originariamente inviato da MrX87
    bhè...anche io sono nuovo...ma penso che dovrei riuscire a risolvere il problema...secondo me si tratta di un problema nella scanf...xkè in genere la scanf legge tutti i caratteri compreso l'invio...quindi x eliminare il problema basta inserire nella scanf un ulteriore %c che "mangierà" il carattere "invio"...prova quindi a scrivere:
    codice:
    scanf ("%c%c", &x);
    sì hai ragione tu, c'è un problema nella scanf. E' da un po' di lustri che viene usata e nessuno se n'era mai accorto..
    ;-)

    EDIT: la soluzione da te proposta, va a scrivere in zone di memoria non definite = crash.

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    sì hai ragione tu, c'è un problema nella scanf. E' da un po' di lustri che viene usata e nessuno se n'era mai accorto..
    ...ma questa frase scommetto che è stata scritta x prendere in giro o cosa?!...io non ho detto mica che ho fatto una scoperta sensazionale...ho solo detto dove poteva essere secondo me il problema...e ho proposto una soluzione...che tra l'altro non è stata neanche inventata da me...

  6. #6
    e ho proposto una soluzione...che tra l'altro non è stata neanche inventata da me...
    Dove l'hai trovata!?

  7. #7
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    mi era stata suggerita in da un amico qualche tempo fa....

  8. #8
    mi era stata suggerita in da un amico qualche tempo fa....
    Mai fidarsi degli amici...

    Puoi scrivere un programmino per testare la soluzione scanf ("%c%c", &x) ?

  9. #9
    Originariamente inviato da MrX87
    ...ma questa frase scommetto che è stata scritta x prendere in giro o cosa?!...io non ho detto mica che ho fatto una scoperta sensazionale...ho solo detto dove poteva essere secondo me il problema...e ho proposto una soluzione...che tra l'altro non è stata neanche inventata da me...
    La soluzione da te proposta (come dici tu: non inventata da te) è errata, e può causare danni non indifferenti se ulteriormente divulgata. Ti consiglio di segnalare l'errore a chi te l'ha proposta.

    Stavolta nessuna battuta, promesso ;-)

  10. #10
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    La soluzione da te proposta (come dici tu: non inventata da te) è errata, e può causare danni non indifferenti se ulteriormente divulgata. Ti consiglio di segnalare l'errore a chi te l'ha proposta.
    okay...allora...ti rigrazio...non pensavo potesse creare danni..ma a sto punto...se invece io inizializzassi una variabile e andassi a inserire lì il return...tipo:
    codice:
    int main ()
    {
    char risp, x;
    do{
      printf ("vuoi uscire dal programma? Y/N\n");
      scanf ("%c%c",&risp, &x);
    }while (risp != 'y');
    }
    così non dovrebbe andare a sovrescrivere niente...Giusto?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.