PDA

Visualizza la versione completa : [C] Crash su inserimento valore numerico con scanf


Lord_Blackout
10-07-2007, 01:01
Ciao a tutti, ho un problema che mi affligge da parechio tempo:

Ho fatto un semplice programmino che fa vari calcoli geometrici, che però quando viene inserita una lettera va in crash:
Es.

scanf("%d", &numero1);

Se in questo scanf gli do una lettera o un simbolo, il programma va in crash...
Mi hanno consigliato di fare così:

if(!scanf("%d", &numero1))
printf("Il tipo di dato inserito non è valido...");
else
RESTO DEL PROGRAMMA

In effetti questa soluzione funziona, però nel programma ci sono decine e decine di scanf, e mettere una struttura simile per ognuno dei tanti, renderebbe il codice illeggibile, oltre al richiedere molto tempo per la programmazione....

Esiste qualche altro metodo valido per evitare il carh in situazioni come questa?

Grazie in anticipo :D

oregon
10-07-2007, 08:10
Usa una funzione e richiamala quando ti serve.

Lord_Blackout
10-07-2007, 14:09
Sono principiante in C, e le funzioni nn le so usare molto bene :bhò:
Mi faresti un esempio (che eviti il crash ovviamente) ???
Thanks :D

oregon
10-07-2007, 14:21
Beh ... in questo caso, diventa un po' difficile per te perche' bisognerebbe passare gli argomenti alla funzione, avere il valore di ritorno, utilizzare i puntatori ...

Quello che ti suggerivo era di scrivere una funzione che accettasse come parametro il puntatore alla variabile da accettare, facesse quei controlli che hai indicato tu e restituisse il valore al chiamante ...

bigmickey
10-07-2007, 15:08
La cosa più semplice che mi viene in mente è (come dice oregon) usare una funzione.
In modo poco elegante potresti dichiarare una variabile globale (in modo che la funzione la veda e faccia il controllo)
Esempio



#include <stdio.h>

void controllo(void); //prototipo


int res; //varibile globale fuori dal main

int main()
{

int numero;

res= scanf("%d",&numero);
controllo();

res= scanf("%d",&numero);
controllo();

res= scanf("%d",&numero);
controllo();

return 0;
}


void controllo(void)
{
if (!res) printf("Il tipo di dato inserito non è valido...");
}

LeleFT
10-07-2007, 15:28
Ho corretto il titolo in modo da conformarlo al regolamento.
La prossima volta cerca di usare dei titoli più significativi.


Ciao. :ciauz:

Lord_Blackout
10-07-2007, 17:22
Vi ringrazio tutti, ora provo...

Samuele_70
10-07-2007, 18:23
Originariamente inviato da bigmickey
...
In modo poco elegante potresti dichiarare una variabile globale (in modo che la funzione la veda e faccia il controllo)
...
Non mi pice per niente :nonono: ( :mame: )

Se devi creare una funzione, tanto vale crearne una che si occupi di tutto :



int GetIntValue( char *msg )
{
int intVal;
printf("%s", msg);
while(!scanf("%d", &intVal))
{
while( getchar() != '\n');
printf("Il tipo di dato inserito non e' valido...\n%s",msg);
}
return intVal;
}

int main()
{
int val, val2;
val = GetIntValue("Inserisci il valore 1 : ");
printf("Valore inserito = %d\n\n", val);
val2 = GetIntValue("Inserisci il valore 2 : ");
printf("Valore inserito = %d\n\n", val2);
...

donato.sciarra
10-07-2007, 19:35
ottima soluzione di Samuele_70 ;)

oregon
10-07-2007, 19:39
Originariamente inviato da donato.sciarra
ottima soluzione di Samuele_70 ;)

Era quello che volevo dire io, solo che ci volevo fare arrivare Lord_Blackout da solo ...

Sono sempre convinto che dal copia-incolla si capisce soltanto che chi ha fornito la soluzione e' un programmatore e chi riceve il codice non ha imparato nulla ... ma e' solo una mia convinzione (e di pochi altri in questo forum, per la verita' ...)

Loading