Newsgroup: it.comp.lang.c
Titolo: Prob con gets() e scanf() !

Ciao a tutti,
scusate ma ho un
problema con un
piccolo programmino
fatto da me per
imparare l'uso di
scanf e gets.
Purtroppo ,
nonostante mi sembri
tutto
corretto il programma
non funziona.. ossia
al momento dell'input
(scanf)
da tastiera i lprog
mi salta direttamente
alla funzione
successiva...!! 
in pratica non
aspetta che l'utente
possa inserire
qualcosa.
C'e' qualcuno che può
aiutarmi??? 
grazie mille
questa è la parte
incriminata del
codice:
******************************************************
#include <stdio.h>
int get_option(void);
main(void)
{
int choice;
char chr;
char str[5];
float flt;
 choice =
get_option();
 if (choice ==  1)
   { printf("\nDammi
un carattere: \n");
      scanf("%c",
&chr);
     printf("\nHai
scelto il carattere
%c", chr);
   }
 if (choice == 2)
  {
   printf("\nDammi un
numero float: ");
    scanf("%f",
&flt);
   printf("\nHai
scelto il numero
%f\n", flt);
  }
 if (choice == 3)
 {
   printf("\nDammi
una stringa di max 5
caratt.: \n");
    gets(str);
   printf("\nHai
digitato la seguente
stringa: %s\n",
str);
 }
  return 0;
}
 
.... non posto il
resto del codice
perchè ininfluente. 
grazie ancora!

miiiiii, sembra di leggere la Divina Commedia!!!!! Fai linee di 70
caratteri, please.
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it

Ops.. un'errore di formattazionedi Netscape  :)
vabbè riposto il source, sperando che mi aiutate a trovare l'errore.
#include <stdio.h>
int get_option(void);
main(void)
{
int choice;
char chr;
char str[5];
float flt;
 choice = get_option();
 if (choice ==  1)
   { printf("\nDammi un carattere: \n");
      scanf("%c", &chr);
     printf("\nHai scelto il carattere %c", chr);
   }
 if (choice == 2)
  {
   printf("\nDammi un numero float: ");
    scanf("%f", &flt);
   printf("\nHai scelto il numero  %f\n", flt);
  }
 if (choice == 3)
 {
   printf("\nDammi una stringa di max 5 caratt.: \n");
    gets(str);
   printf("\nHai digitato la seguente stringa: %s\n",  str);
 }
  return 0;
}
int get_option(void)
....
...
tralascio il resto del codice.
grazie mille

qualcosa.
Non ricordo perchè, ma devi mettere:
	scanf("%*c%c",&chr)
occio all'asterisco.
Dovrebbe funzionare.
saluti.
Robby





E' incredibile , possibile che la compilazione del prog dipendi dal
compilatore?? .. io uso Linux. Una funzione come scanf() e gets() DEVE
funzionare su tutti i compilatori allo stesso modo...o no?!
Cmq questo è l'intero source (non è tanto):
#include <stdio.h>
int get_option(void);
main(void)
{
int choice;
char chr;
char str[5];
float flt;
 choice = get_option();
 if (choice ==  1)
   { printf("\nDammi un carattere: \n");
      scanf("%c", &chr);
     printf("\nHai scelto il carattere %c", chr);
   }
 if (choice == 2)
  {
   printf("\nDammi un numero float: ");
    scanf("%f", &flt);
   printf("\nHai scelto il numero  %f\n", flt);
  }
 if (choice == 3)
 {
   printf("\nDammi una stringa di max 5 caratt.: \n");
    gets(str);
   printf("\nHai digitato la seguente stringa: %s\n",  str);
 }
  return 0;
}
int get_option(void)
{
int var;
 do {
  printf("Scegli un'opzione.\n\n");
  printf("1)\tDammi un carattere.\n");
  printf("2)\tDammi un numero con virgola.\n");
  printf("3)\tDammi una stringa.\n");
  printf("4)\tEsci\n");
  scanf("%d", &var);
 } while(var < 1 || var > 4);
 return var;
}
Ribadisco che il prob è che mi salta l'input dell'utente (nello char)
grazie ancora

 grazie ancora
Quando digiti la scelta, la scanf di un intero si beve solo
i caratteri che servono ad assegnare un int, cioe' solo caratteri
numerici e lascia nel buffer di stdin il carattere '\n' in Linux
o '\r''\n' in DOS disponibili per la prossima lettura. Se la lettura
successiva e' una stringa, la scanf si alliena al primo char non di
spazia e tutto funziona. anche se leggi un float o un intero. se
seggi un char devi prima allinearti con il flusso di input svuotando
il buffer. ci sono varie tecniche, ma ti suggerisco di sceglierne una
protabile, visto che usi Linux. potresit leggere tutti i caratteri
fino a '\n' e poi chiamare scanf per leggere il char, o leggere una
stringa e usare solo il primo carattere.
Se uno all' input di choice digita caratteri alfanumerici dopo il
numerico
pero' quelli saranno letti come input successifo. il codice cosi'
concepito non prevede la gestione di input errati.
ciao.

 ha scritto:

qui aggiungi
while (getchar() != '\n');
per pulire il buffer di input, perche' la scanf non legge il newline.


   scanf("%d", &var);
scanf("%d%*c", &var);
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)