PDA

View Full Version : [c/c++] Controllo dati immessi


Biscazziere
12-03-2006, 12:24
Ciao, devo controllare che il dato inserito dall'utente sia numerico e che quindi non contenga lettere. In più, devo visualizzare se l'utente preme <ctrl>+z . Ora, sapendo che se si preme <ctrl>+z con getchar viene restituito il valore -1, perchè il programma non funziona se viene premuto ctrl+z?


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


main(){
int c, flagErr, flag2;
flagErr = 0;
flag2 = 0;


while(c!=0 && c!=10){

c=getchar();

//

if(c!=10){

if(c<'0' || c>'9'){

flagErr = 1;


}

if(c==-1){

flag2 = 1;

}

//printf("%d\n", c);
}


}

if(flagErr==1){

printf("Non hai inserito un valore numerico corretto!\n");

}else{

printf("Hai inserito un valore numerico corretto!\n");

}

if(flag2==1){

printf("Hai battuto <ctrl>+z \n");

}

scanf("%d");
}




Grazie

andbin
12-03-2006, 16:13
Ciao, devo controllare che il dato inserito dall'utente sia numerico e che quindi non contenga lettere. In più, devo visualizzare se l'utente preme <ctrl>+z . Ora, sapendo che se si preme <ctrl>+z con getchar viene restituito il valore -1, perchè il programma non funziona se viene premuto ctrl+z?
Intanto ci sono diverse cose che non vanno nel tuo sorgente:

Quel -1 di cui parli è il EOF. Sui sistemi Dos/Win, dalla console, la pressione della combinazione ctrl+z fa restituire alla getchar il codice 26 (0x1A).
È poco utile l'uso di un ciclo 'while' quando invece sarebbe più logico usare il ciclo 'do-while' (dopotutto, la getchar la devi eseguire almeno 1 volta!).
La variabile 'c' non è inizializzata.
Nel ciclo while comunque non hai messo un qualcosa (es. break) per uscire dal ciclo. Testi se c è diverso da 0 (e in quale condizione te lo darebbe?) e se è diverso da 10 (perché??).
Dichiara sempre int main () e restituisci un valore interno.

Biscazziere
12-03-2006, 18:47
Grazie mille per la risposta.. cerco di chiarirti meglio cosa intendo fare:

devo realizzare una funzione che stailisca la validità di un valore numerico inserito e che restituisca il valore EOF se l'utente preme ctrl+z.

Per semplicità, prima di creare una funzione apposta, volevo fare prima un programma di main (diciamo un "abbozzo") per non incasinarmi con le funzioni.

Ho inserito il controllo per c!=10 perchè ho il problema dell'invio... se l'utente preme INVIO dopo aver inserito una certa quantità di cifre, quell'invio è considerato come un carattere e il programma va avanti, che è quello che non voglio.... voglio che dopo che l'utente prema invio il dato sia preso come definitivo.

Ho provato così, ma non riesco ancora a stabilire quando si è premuto ctrl+z

int main(){

int i, c, flagErr, flagEOF, flagSign, flagPoint;
flagErr = 0;
flagEOF = 0;
flagSign = 0;
flagPoint = 0;
i=0;
c=1;

do{

c=getchar();

if(c!=10){

if((c<'0' || c>'9') && c!='-' && c!='+' && c!='.' && c!=26)

flagErr = 1;

if(c==26) flagEOF = 1;

if(c=='+'){
flagSign++;

if(i>0)
flagSign++;
}

if(c=='-'){
flagSign++;

if(i>0)
flagSign++;
}

if(c=='.') flagPoint++;


// printf("%d\n", flagEOF);
}

i++;

}while(c!=0 && c!=10);

if(flagSign>1) printf("Problema di segno\n");

if(flagPoint>1) printf("Problema di punto\n");

if(flagErr==1) printf("Problema di lettere\n");

if(flagEOF==1) printf("Hai battuto ctrl+z\n");

scanf("%d");

return 0;

}

Grazie di nuovo!