Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Gestione input da tastiera
Forum - C/C++ - Gestione input da tastiera

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
zanardi84 (Normal User)
Newbie


Messaggi: 11
Iscritto: 28/02/2011

Segnala al moderatore
Postato alle 17:43
Lunedì, 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?

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 20:30
Lunedì, 28/02/2011
Testo quotato

Postato originariamente da zanardi84:
Ma per quanto riguarda i float?  



Dimentichi che i float hanno il punto :k:

PM Quote
Avatar
zanardi84 (Normal User)
Newbie


Messaggi: 11
Iscritto: 28/02/2011

Segnala al moderatore
Postato alle 21:04
Lunedì, 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?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 21:45
Lunedì, 28/02/2011
perchè no? :-)

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 21:51
Lunedì, 28/02/2011
scusa, ma non ha senso effettuare una scansione per verificare se sia un numero oppure no.

puoi fare così:
Codice sorgente - presumibilmente Delphi

  1. string digitato = input(); // ci salvi l'input letto
  2. if(digitato.find(".") != string::npos)
  3. {
  4.      if(digitato.compare("0.0") != 0 && atof(digitato.c_str()) == 0.0)
  5.            cout << "E' una stringa";
  6.      else
  7.            cout << "E' un float";
  8. }
  9. else
  10. {
  11.      if(digitato.compare("0") != 0 && atoi(digitato.c_str()) == 0)
  12.            cout << "E' una stringa";
  13.      else
  14.            cout << "E' un intero";
  15. }


PM Quote
Avatar
zanardi84 (Normal User)
Newbie


Messaggi: 11
Iscritto: 28/02/2011

Segnala al moderatore
Postato alle 15:59
Mercoledì, 02/03/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++

  1. int dimensione;
  2. int caratteri;
  3. char stringa[dimensione];
  4. 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.


PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 16:24
Mercoledì, 02/03/2011
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!

PM Quote
Avatar
zanardi84 (Normal User)
Newbie


Messaggi: 11
Iscritto: 28/02/2011

Segnala al moderatore
Postato alle 18:32
Mercoledì, 02/03/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.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 19:04
Mercoledì, 02/03/2011
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ì ;)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo