Newsgroup: it.comp.lang.c
Titolo: Problema mica tanto semplice!!!

ciao a tutti,
avete presente, per quanto grande sia la vostra esperienza, la mitica
scanf( )?
ebbene: se io chiamo una scanf( ) in questo modo:
    ...
    ...
        scanf("%d", &nome_variabile);
    ...
    ...
suppongo che l'utente inserisca un dato numerico!
e se inserisce un dato alfanumerico? ad esempio la lettera 'S' ?
il programma va in crash! beh, non esageriamo! entra in un apparente ciclo
infinito!
bene.
sono quasi riuscito ad ovviare il problema in questo modo:
#include <stdio.h>
#include <conio.h>
int pote(int, char);
void main()
{
 char temp[6];
 int num=0;
 int flag;
 int i, j;
 do {
  flag=0;
  j=0;
  for(i=0; i<6; i++)
   temp[i]='0';
  printf("\n\nInerisca il valore; il valore da lei inserito ");
  printf("deve essere compreso tra -32768 e 32767; inoltre, se ");
  printf("tra i valori inserisce il carattere NULL (spazio) ");
  printf("verranno presi in considerazione solo i valori ");
  printf("antecedenti il carattere NULL\n\n");
  scanf("%s", temp);
  for(i=0; i<6; i++) {
   if((temp[i]>0 && temp[i]<48) || temp[i]>57)
    flag++;
  }
  if(flag==0) {
   for(i=0; temp[i]!=0; i++)
    {}
   i--;
   for(; i>=0; i--) {
    num=num + (temp[i]-48)*pote(10, j);
    j++;
   }
   printf("%d\n", num*2);
  }
  else {
   printf("Lei ha inserito dei caratteri al posto di numeri\n");
   printf("Il programma non e' stato colto di sorpresa\n");
   printf("Deve inserire un numero\n");
  }
 }while(flag>0);
}
int pote(int base, char espo)
{
 char i;
 int ris=1;
 for(i=0; i<espo; i++)
  ris=base*ris;
 return(ris);
}
che non fa altro che gestire il numero come array di caratteri e poi esegue
tutte le sue sante conversioni!
I problemi sono due:
1. se inserisco il carattere spazio non mi da errore e mi prende come numero
valido la parte antecedente allo spazio.
2. funziona solo con i positivi :-(((((((((((
nessuno che abbia tempo e suggerimenti preziosi?
grazie a tutti sentitamente!
ciaooo

 nessuno che abbia tempo e suggerimenti preziosi?
Il tuo codice  non l'ho controllato, pero` posso dirti  che il valore di
ritorno di scanf rappresenta il numero di conversioni riuscite:
int n;
while(scanf("%d", &n) != 1) {
        while(getchar() != '\n')
                ;
        printf("Inserisci un numero!\n");
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"Su cio` di cui non si puo` parlare e` bene tacere".
 Ludwig Wittgenstein

sono quasi riuscito ad ovviare il problema in questo modo:
[cut]
in passato ho trovato gli stessi problemi;
se vuoi puoi provare con
int getint( FILE* f, int* i)
{int c;
 while( fscanf(f,"%d", i) != 1 ) 
              {fprintf(stderr , "Errore> ");
               while((c=fgetc(f))!='\n' && c!=EOF);
               if(c==EOF) return -1;
              }
 return 0;
}
uso con input tastiera (file stdin):
int n;
....
getint(stdin, &n);

 Kronos
grazie millanta!


 ma non deve essere cosi`! ;-)
Come no? Lo specificatore di conversione  "%d" indica un numero decimale
interno con o senza segno. Ovviamente la conversione si ferma alla prima
non-cifra (isdigit == 0) che  incontra. Per lo stesso motivo se utilizzi
"%s" come specificatore di conversione ed inserisci "pippo pluto" verra`
memorizzato solo "pluto". Questo e` il modo di lavorare della scanf.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Mi piace avere amici rispettabili;
Mi piace essere il peggiore della compagnia.

 ciao
ciao
bel sito


 caratteri e dare errore!
Allora e` meglio abbandonare la scanf a favore della fgets:
#define MAX_LEN 100
char buff[MAX_LEN];
int num;
char *p;
fgets(buff, MAX_LEN, stdin);
p = buff;
while(1) {
        if (!isdigit(*p)) {
	       printf("Errore\n");
	       num = -1;
	       break;
	}
	p++;
	if (*p == '\0' || *p == '\n') {
	       sscanf(buff, "%d", &num);
	       break;
	}
}
printf("%d\n", num);
Il ciclo esce con num settato al  valore letto oppure a -1 se c'e` stato
un errore  (ovviamente -1 e` accettabile  se non e` nel  range di valori
validi per num). Al limite potresti  costruire un ciclo piu` esterno che
legge fino a quando (num != -1) in modo da assicurarti un input valido.
Per la conversione uso sscanf (non la faccio manualmente).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Il coraggio non mi manca.
E` la paura che mi frega...