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
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!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.