PDA

Visualizza la versione completa : [C] lettura ignorata


slashino
27-12-2011, 14:28
Salve, vi posto questa parte di codice.


int lettura(char v[10][20], char *sep, char st[])
{
FILE* f;
int dim,z,k,i;
char nome[10];
printf("Inserire il nome del file da cui prendere le parole\n");
scanf("%s", nome);
f=fopen(nome, "r");
if(f==NULL)
{
dim=-1;
}
else
{
printf("Inserire qual'e' il separatore\n");
scanf("%c", sep);
fscanf(f,"%s", st);

La situazione questa: prendo in un file una stringa formata da un certo numero di parole divise da un certo separatore e su di esse faccio delle operazioni.Il problema che viene completamente ignorata l'istruzione:


scanf("%c", sep);

Viene stampata a video solo la richiesta di inserire il separatore...non riesco a trovare l'errore :(

oregon
27-12-2011, 14:56
Il problema dovuto al fatto che il buffer di tastiera contiene l'invio della scanf precedente. Devi ripulire il buffer e quindi prima della scanf("%c", &sep) scrivi

while(getchar()!='\n') ;

torn24
27-12-2011, 14:58
Rimaneva nel buffer il carattere invio del precedente scanf ! quando incontrava il nuovo
scanf terminava subito , e non leggeva il carattere di controllo . succede sempre
quando si vuole leggere un carattere %c con scanf
Dopo aver letto il carattere separatore ricordati di usarlo in seguito con l'asterisco


int lettura(char v[10][20], char *sep, char st[])
{
FILE* f;
int dim,z,k,i;
char nome[10];
printf("Inserire il nome del file da cui prendere le parole\n");
scanf("%s", nome);
f=fopen(nome, "r");
if(f==NULL)
{
dim=-1;
}
else
{
printf("Inserire qual'e' il separatore\n");
fflush(stdin);// PULISCE stdin dal carettere invio del precedente scanf
scanf("%c", sep);
printf("valore di sep %c\n",*sep);// dopo usa *sep e non sep :)
fscanf(f,"%s", st);
}
}












Ciao oregon, non avevo visto la tua risposta :)

slashino
27-12-2011, 15:06
Grazie ad entrambi :) Ultima domanda: i metodi che mi avete suggerito voi sono completamente equivalenti dal punto di vista pratico tra di loro giusto? ( cos come scrivere scanf(" %c", dim) in modo tale che mi ignora gli spazi/newline?)

oregon
27-12-2011, 15:17
No ... non lo sono del tutto.

La fflush per lo stdin non standard e funziona solo con Visual C++ e Windows.

slashino
27-12-2011, 15:29
Ok grazie mille

Loading