PDA

Visualizza la versione completa : [C] Acquisizione di stringhe con scanf()


sparkling
14-06-2007, 13:57
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... :smack:

oregon
14-06-2007, 18:56
Se devi inserire una stringa, allora perche' hai dichiarato mess come char?

Samuele_70
14-06-2007, 19:13
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:


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... :smack:

Prova a svuotare il buffer di input in questo modo :


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");

sparkling
14-06-2007, 19:15
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 ** ...

sparkling
14-06-2007, 19:20
Originariamente inviato da Samuele_70
mess deve puntare ad un vettore di char, non va bene se un singolo char.
ad es:


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 :


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!!!

Samuele_70
14-06-2007, 19:33
Originariamente inviato da sparkling
Ehm...come un singolo char (vedi commento sopra)... ma in altre occasioni non mi ha dato problemi questa cosa...

:oVVoVe: 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 :D

oregon
14-06-2007, 19:49
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?

sparkling
15-06-2007, 17:03
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!!! :unz:

Loading