Ciao ragazzi,
grazie mille intanto per le risposte!
Vi specifico che sto lavorando su un O.S. GNU/Linux con l'ide qt creator, facendo dei progetti non grafici in c!
Dico questo perché ho fatto la
#define fflush(stdin) while ((getchar()) != '\n')
in quanto altrimenti fflush(stdin) non da nessun errore ma nemmeno produce l'effetto voluto!
domanda 1: fflush(stdin) funziona per sistemi GNU/Linux?
vbextreme ha scritto:
Il problema affligge solo la funzione scanf.
Quindi sarà piu consono chiamare la define come flushscanf. e in definitiva potresti metterlo dietro ad ogni scanf solo per sicurezza.
la gets non soffre di tali problematiche.
Dopo la printf ci va la fflush(stdout) quando vuoi essere sicuro che venga vuotato il buffer di uscita.
Sotto windows è praticamente inutile,mentre sotto linux te ne accorgi subito quando e dove va messo.
Capito, infatti se non mettevo prima di gets o di scanf(%[^\n]s) la fflushscanf mi succedeva che lo saltasse! Ho capito che in pratica c'era un '\n' vagante e mettendo dopo ogni printf
fflush(stdout);
funziona tutto perché evidentemente dipendeva da quello!
domanda 2: la scanf(%[^\n]s) si comporta come la gets e quindi non ho esigenza di fare fflushscanf?
Invece della define per fflusf(stdin) posso usare anche una funzione definita appositamente come potete vedere dal codice in allegato alla fine: nel mio esempio il risultato è equivalente!
domanda 3: nel caso effettivamente mi confermiate che fflush(stdin) non funzioni su sistemi GNU/Linux come mi consigliate ovviare, con la define o con la funzione?
Posto il codice su cui ho fatto le prove in allegato!
grazie mille
Igor
#include <stdio.h>
#include <string.h>
#define lungstrin 10
#define fflushscanf while ((getchar()) != '\n')
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
void lettura_stringa(char stringa_v[])
{
int i;
printf("[");
fflush(stdout);
for(i=0;i<=lungstrin-1;i++)
{
if(stringa_v[i]=='\0')
{
printf("\\0");
fflush(stdout);
}
else if(stringa_v[i]=='\n')
{
printf("\\n");
fflush(stdout);
}
else
{
printf("%c",stringa_v[i]);
fflush(stdout);
}
if(i==lungstrin-1)
continue;
printf(",");
fflush(stdout);
}
printf("]");
fflush(stdout);
}
int main()
{
char scelta[30];
char stringa[]="##########";
char *stringa1;
stringa1=stringa;
printf("vediamo come riempiono le stringhe scanf e gets\n");
fflush(stdout);
scanf("%s",scelta);
//fflushscanf;
clean_stdin();
if(!strcmp(scelta,"scanf1"))
{
printf("\immetti stringa!\n");
fflush(stdout);
scanf("%s",stringa);
//fflushscanf;
clean_stdin();
lettura_stringa(stringa);
printf("\n%s\n",stringa);
fflush(stdout);
puts(stringa);
}
else if(!strcmp(scelta,"scanf2"))
{
printf("\immetti stringa!\n");
fflush(stdout);
//clean_stdin();
scanf("%[^\n]s",stringa);
lettura_stringa(stringa);
printf("\n%s\n",stringa);
fflush(stdout);
puts(stringa);
}
else if(!strcmp(scelta,"gets"))
{
printf("\immetti stringa!\n");
fflush(stdout);
//clean_stdin();
gets(stringa);
lettura_stringa(stringa);
printf("\n%s\n",stringa);
fflush(stdout);
puts(stringa);
}
return 0;