Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] una scanf che non funziona...

    Sto realizzando un progetto per l'universita' e di fronte a questo codice ho riscontrato un problema...

    do
    {
    printf("\n-? ");
    ris = scanf("%d CIAO %s",&m,&mess);
    }
    while(ris != 2);

    mess e' un char e m un int ovviamente...
    In pratica quello che dovrebbe fare e' entrare in ciclo fintanto che la stringa digitata da shell non e' quella giusta, ovvero " intero CIAO stringa".
    Avevo pensato di controllare che la scanf tornasse 2, in quanto se va a buon fine effettivamente ritorna 2 mettendo l'intero in m e la stringa in mess ed esce dal ciclo. Il problema arriva se non scrivo la cosa giusta poiche' entra nel do, fa la scanf una volta, digito la cosa sbagliata e a quel punto non fa piu' la scanf ma cicla all'infinito stampando -?..
    Perche' la scanf funziona una volta sola?
    Ho provato a cercare di metterci fflush per liberare il buffer ma non funziona ugualmente e poi sinceramente non ne capisco tanto il senso... :master:
    Se potete darmi una mano ve ne sarei grata...
    Silvia C.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Se devi inserire una stringa, allora perche' hai dichiarato mess come char?

  3. #3

    Re: [C] una scanf che non funziona...

    Originariamente inviato da sparkling
    Sto realizzando un progetto per l'universita' e di fronte a questo codice ho riscontrato un problema...

    do
    {
    printf("\n-? ");
    ris = scanf("%d CIAO %s",&m,&mess);
    }
    while(ris != 2);

    mess e' un char e m un int ovviamente...
    In pratica quello che dovrebbe fare e' entrare in ciclo fintanto che la stringa digitata da shell non e' quella giusta, ovvero " intero CIAO stringa".
    mess deve puntare ad un vettore di char, non va bene se è un singolo char.
    ad es:
    codice:
    	char mess[200];
    Tu come hai dichiarato mess?
    Avevo pensato di controllare che la scanf tornasse 2, in quanto se va a buon fine effettivamente ritorna 2 mettendo l'intero in m e la stringa in mess ed esce dal ciclo. Il problema arriva se non scrivo la cosa giusta poiche' entra nel do, fa la scanf una volta, digito la cosa sbagliata e a quel punto non fa piu' la scanf ma cicla all'infinito stampando -?..
    Perche' la scanf funziona una volta sola?
    Ho provato a cercare di metterci fflush per liberare il buffer ma non funziona ugualmente e poi sinceramente non ne capisco tanto il senso... :master:
    Se potete darmi una mano ve ne sarei grata...
    Prova a svuotare il buffer di input in questo modo :
    codice:
    	char mess[80];
    	int  ris, m, i;
    	for( i=0; i<3; i++)
    	{
    		do
    		{
    			printf("\n-? ");
    			ris = scanf("%d CIAO %s",&m, mess);
    			while( getchar()!='\n'); // <<<Svuoto il buffer di input (stdin)...
    		}
    		while(ris != 2);
    		printf("\nDati inseriti : \n");
    		printf("int   =  %d\n", m);
    		printf("char* = '%s'\n", mess);
    	}
    	printf("\nFine.\n");
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Ho dichiarato char perche' con la scanf metto l' & prima !! Quindi in realta' non e' un char ma un char * !!!
    Altrimenti se dichiaravo char * mess lui me la vedeva come char ** ...
    Silvia C.

  5. #5

    Re: Re: [C] una scanf che non funziona...

    Originariamente inviato da Samuele_70
    mess deve puntare ad un vettore di char, non va bene se è un singolo char.
    ad es:
    codice:
    	char mess[200];
    Tu come hai dichiarato mess?
    Ehm...come un singolo char (vedi commento sopra)... ma in altre occasioni non mi ha dato problemi questa cosa...


    Prova a svuotare il buffer di input in questo modo :
    codice:
    	char mess[80];
    	int  ris, m, i;
    	for( i=0; i<3; i++)
    	{
    		do
    		{
    			printf("\n-? ");
    			ris = scanf("%d CIAO %s",&m, mess);
    			while( getchar()!='\n'); // <<<Svuoto il buffer di input (stdin)...
    		}
    		while(ris != 2);
    		printf("\nDati inseriti : \n");
    		printf("int   =  %d\n", m);
    		printf("char* = '%s'\n", mess);
    	}
    	printf("\nFine.\n");
    Provero'!!!! Poi vi faccio sapere!!!
    Silvia C.

  6. #6

    Re: Re: Re: [C] una scanf che non funziona...

    Originariamente inviato da sparkling
    Ehm...come un singolo char (vedi commento sopra)... ma in altre occasioni non mi ha dato problemi questa cosa...
    VVoVe: Una varibile di tipo char non va bene! (come ti ha già detto oregon)
    Dato che devi acquisire con la scanf, una stringa, devi passargli come parametro il puntatore
    al primo char di una stringa. Che 'c'azzecca' un singolo char ? ( )

    Provero'!!!! Poi vi faccio sapere!!!
    Vai tranquilla
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da sparkling
    Ho dichiarato char perche' con la scanf metto l' & prima !! Quindi in realta' non e' un char ma un char * !!!
    Altrimenti se dichiaravo char * mess lui me la vedeva come char ** ...
    Se utilizzi un solo char, dove pensi che finiscano tutti i caratteri dopo il primo che inserisci da tastiera?

  8. #8
    Originariamente inviato da oregon
    Se utilizzi un solo char, dove pensi che finiscano tutti i caratteri dopo il primo che inserisci da tastiera?
    :master: :master: :master:
    Mmmmm... mi sa che non ho ancora molto chiaro il C ... comunque si', hai perfettamente ragione. Molto probabilmente mi sono fatta ingannare da un esempio sui lucidi della prof...

    Comunque adesso funziona!!! In ogni modo, ill problema che dava non era dovuto alla stringa ma proprio allo svuotamento del buffer!!! E' bastato mettere while( getchar()!='\n'); come da suggerimento di Samuele70!! Grazie mille!!!
    Silvia C.

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.