zanardi84 (Normal User)
Newbie
Messaggi: 11
Iscritto: 28/02/2011
|
Mi trovo alle prese con un problema cui non riesco a trovare una soluzione.
Voglio scrivere il classico programma console con una gestione efficace dell'input da tastiera. Per ottenere ciò vorrei che se digitassi un contenuto del tutto casuale laddove mi viene richiesto un numero, mi segnalasse un errore invitandomi a ridigitare.
Sono riuscito ad ottenere un buon risultato per quanto riguarda gli int: acquisisco una stringa da input, la scansiono e se trovo un carattere diverso da una cifra lo segnalo. In seguito, converto a int la stringa.
Ma per quanto riguarda i float?
|
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
Postato originariamente da zanardi84:
Ma per quanto riguarda i float? |
Dimentichi che i float hanno il punto |
|
zanardi84 (Normal User)
Newbie
Messaggi: 11
Iscritto: 28/02/2011
|
Hai perfettamente ragione ed è quello che avevo pensato pure io:
scansiono il mio vettore di caratteri alla ricerca di tutti i quelli che sono diversi dalle cifre, fatta eccezione per il carattere "punto" che considero valido.
Il problema arriva dopo: come gestisco la conversione? Con un semplice atof?
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
perchè no? :-)
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
scusa, ma non ha senso effettuare una scansione per verificare se sia un numero oppure no.
puoi fare così:
Codice sorgente - presumibilmente Delphi |
string digitato = input(); // ci salvi l'input letto if(digitato.find(".") != string::npos) { if(digitato.compare("0.0") != 0 && atof(digitato.c_str()) == 0.0) cout << "E' una stringa"; else cout << "E' un float"; } else { if(digitato.compare("0") != 0 && atoi(digitato.c_str()) == 0) cout << "E' una stringa"; else cout << "E' un intero"; }
|
|
|
zanardi84 (Normal User)
Newbie
Messaggi: 11
Iscritto: 28/02/2011
|
Rieccomi, con un dubbio che voglio cercare di risolvere.
Input da tastiera di una stringa, c++ standard, senza l'uso degli oggetti.
Codice sorgente - presumibilmente C/C++ |
int dimensione;
int caratteri;
char stringa[dimensione];
cin.getline(stringa, caratteri);
|
Mi pare di aver capito che dimensione, cioè la capienza del vettore, è contenuto anche il carattere di fine stringa '\0' che corrisponde al tasto invio.
Quanti caratteri posso leggere al massimo?
Cosa succede se ne leggo di meno o di più?
La conta dei caratteri come avviene?
Grazie.
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
al massimo puoi leggere "dimensione-1" caratteri.
Se ne leggi di più "apparentemente" funziona bene, ma in pratica il compilatore "sa" che la variabile stringa contiene "dimensione" elementi, quindi tutti i byte successivi per lui sono byte liberi!
Quindi può accadere che scrivendo alcuni byte in più tu vada a sovrascrivere l'area di memori occupata da altre variabili, andando a provocare degli errori difficili da scovare. Dipende cosa vai a sovrascrivere il programma potrebbe crashare in modo sistematico oppure potresti non accorgerti di nulla e crashare una volta su 100, facendoti letteralmente impazzire perchè sarà difficile trovare il difetto!
|
|
zanardi84 (Normal User)
Newbie
Messaggi: 11
Iscritto: 28/02/2011
|
Quindi nel caso del codice che ho postato,
se dimensione = 10, posso al massimo scrivere cin.getline(stringa, 9) che mi legge 9 caratteri.
Per quanto riguarda il conteggio dei caratteri (che mi sarà utile quando dovrò leggere i file)?
Se ho una stringa o una riga così: asdfty53tyfv
e voglio leggere 4 caratteri, mi sarà dato in output asdf giusto?
Se se voglio continuare a leggere il buffer dalla seguente? Parte dalla t giusto?
Grazie.
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
esattamente :-)
considera sempre che in una stringa C-style, l'ultimo carattere DEVE sempre essere uno zero (il numero zero, non il carattere ascii dello zero!), quindi perdi sempre un byte nelle stringhe.
Per il conteggio dei caratteri hai detto bene, funziona proprio così
|
|