PDA

Visualizza la versione completa : [c]errore nel ciclo


cristianc
22-06-2008, 15:27
Ciao,ho scritto questo programma che fa uso di un ciclo:


#include <stdio.h>

main()
{
int i,n,num,cont_d,cont_c,cont_m;
printf("\nRICERCA DEI VALORI 10,100 E 1000 ALL'INTERNO DI UN INSIEME DI NUMERI\n");
printf("\nNumero di interi: ");
scanf("%d",&n);
cont_d=0;
cont_c=0;
cont_m=0;
for(i=0;i<n;i++) {
printf("Inserisci un numero intero: ");
scanf("%d",&num);
if (num==10) cont_d++;
if (num==100) cont_c++;
if (num==1000) cont_m++;
}
printf("\nIl valore 10 é stato inserito %d volt%c.",cont_d,(cont_d==1) ? 'a' : 'e');
printf("\nIl valore 100 é stato inserito %d volt%c.",cont_c,(cont_c==1) ? 'a' : 'e');
printf("\nIl valore 1000 é stato inserito %d volt%c.\n\n",cont_m,(cont_m==1) ? 'a' : 'e');
}


Se pero' per sbaglio digito in modo sbagliato,accade che un valore viene conteggiato piu delle volte digitate, invece che uscire un semplice errore.Come mai?E come si puo fare per riportare le cose alla logica?

RICERCA DEI VALORI 10,100 E 1000 ALL'INTERNO DI UN INSIEME DI NUMERI

Numero di interi: 4
Inserisci un numero intero: 1000
Inserisci un numero intero: 1000
Inserisci un numero intero: q
Inserisci un numero intero:
Il valore 10 é stato inserito 0 volte.
Il valore 100 é stato inserito 0 volte.
Il valore 1000 é stato inserito 4 volte.

oregon
22-06-2008, 15:39
La scanf restituisce un valore che dovresti testare prima di continuare ad eseguire il ciclo ...

LexLex
22-06-2008, 16:03
Probabilmente nel mia grande ignoranza ho sempre scritto molto più codice di quanto fosse necessario:

Io il problema dell'inserimento di lettere in luogo di numeri l'ho risolto così:



#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

int main() {
char str[20],c;
int intero, i=0;

printf("Inserisci un intero positivo: ");
for(;;) {
c = getchar();
if (c == '\n') break;

if (isdigit(c)) str[i++] = c;
else {
printf("ERRORE");
break;
}
}
intero = atoi(str);
}

logicamente si può mettere tutto in un ciclo do..while se si verifica l'errore e far inserire di nuovo il valore.. è l'unica soluzione che ho.
Anzi.. per favore correggetemi se scrivo inutilmente..

Grazie

GreyFox86
22-06-2008, 18:27
dal man scanf:


RETURN VALUE
These functions return the number of input items successfully matched
and assigned, which can be fewer than provided for, or even zero in
the event of an early matching failure.

The value EOF is returned if the end of input is reached before
either the first successful conversion or a matching failure occurs.
EOF is also returned if a read error occurs, in which case the error
indicator for the stream (see ferror(3)) is set, and errno is set
indicate the error.


:ciauz:

LexLex
23-06-2008, 00:28
Scusate, personalmente continuo a non capire..
Ho chiaro il significato del valore di ritorno della scanf,
ma secondo me il problema si pone comunque nel caso
l'utente inserisca ad esempio una lettera al posto di un numero..

a prescindere dal fatto che con il mio compilatore (gcc) se inserisco
una lettera al posto di un intero mi entra in un loop infinito
(proprio per questo scrivo quel codice descritto sopra), ma anche se
così non fosse.. sicuramente inserire una lettera in luogo di un numero
è un errore, che porterà ad altri errori...

Quello che non capisco è come mi può aiutare il valore di ritorno della
funzione scanf, una lettera con il cast del formato ad intero non è
pur sempre un numero ?? La scanf non mi restituisce comunque un
valore positivo ??

Grazie a chi vorrà insegnarmi qualcosa.. :)

oregon
23-06-2008, 00:33
Ma tu hai letto dalla documentazione cosa restituisce la scanf e cosa vuol dire?

GreyFox86
23-06-2008, 00:35
E' semplice, se la scanf non riconosce l'input come un numero, restituirà 0 perché non è riuscita ad assegnare neppure un valore. Un piccolo esempio:


gr3yfox test $ cat scf.c
#include <stdio.h>

int main() {
int a;
printf("->%d\n", scanf("%d", &a));
printf("%d\n", a);
}

gr3yfox test $ ./scf
12
->1
12
gr3yfox test $ ./scf
deaw423ad
->0
0
gr3yfox test $ ./scf
23d
->1
23

Vincenzo1968
23-06-2008, 00:36
Ciao Lex,

puoi usare la funzione gets al posto di scanf. Controlli che la stringa sia nel formato corretto:

http://www.guidealgoritmi.it/ShowArticle.aspx?ID=6

e, in caso affermativo, converti la stringa in intero con la funzione [b]atoi[b].

:)

LexLex
23-06-2008, 00:39
Se non ho capito male,
Restituisce il numero di "variabili" (non ho trovato una parola migliore) correttamente assegnate,
oppure 0 nel caso di nessun assegnamento, o EOF nel caso non si sia potuto leggere nulla :)

in parole semplici ho capito questo

GreyFox86
23-06-2008, 00:40
Usare gets non è mai una buona idea se non si vuole espressamente dare spazio a buffer overflow.

edit:
dal man gets

BUGS
Never use gets(). Because it is impossible to tell without knowing
the data in advance how many characters gets() will read, and because
gets() will continue to store characters past the end of the buffer,
it is extremely dangerous to use. It has been used to break computer
security. Use fgets() instead.

Loading