|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2001
Città: Trento
Messaggi: 7095
|
get
while(!cin.getline(Buffer,100))
{ cout << "Reinserire la stringa " << endl; cout << "stringa : " ; } HO un problema, se inserisco da tastiera una serie di caratteri inferiore a 99 tutto funziona correttamente, ma se per caso ne inserisco 110, il programma va in loop e non mi lascia inserire più niente. Bisogna "Resettare" il cin, oppure bisogna fare qualche altra strana cosa??? Grazie ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Primo...la cin.getline ritorna una istream che è difficile che sia 0...
Secondo...se hai allocato 100 byte e te ce ne vai a mettere 110 è molto probabile che qualcosa smetta di funzionare...ed è per questo che va in loop... |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2001
Città: Trento
Messaggi: 7095
|
La volevo usare proprio nel caso in cui vengano inseriti troppi caratteri, così alloco più memoria e ne leggo di più.
Ma se la uso una sola volta, del tipo: if (!cin.getline(Buffer,100)) cout << "Non e' stato possibile leggere la stringa"; Altrimenti c'è qualcosa del genere che mi permatte da leggere una stringa da tastiera senza avere il problema di perdere delle informazioni in questa operazione. Ciao Grazie |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Purtroppo no...
Devi fare in questo modo... char tmp[101]; char *buffer = new char[100]; int i = 0; do{ cin.getline(str, 100); if(i>0) { char *tmp = buffer; buffer = new char [(i+2)*100]; memcpy(buffer, tmp, (i+1)*100); delete[] tmp; } memcpy(buffer+ i*100, str, 100); ++i; }while (strlen(str) > 99); Ricordati di fare in fondo alla funzione : delete[] buffer; E' un metodo molto brutto e che crea molta frammentazione dello heap...ma è l'unico (non l'ho verificato, l'ho scritto al volo)... |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2001
Città: Trento
Messaggi: 7095
|
Grazie 1000. Lo provo e ti so dire.
Ciao |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Ciao !
Un modo molto semplice per fare quello che vuoi tu e' il semplice: ... string s; getline( cin , s ); const char* buf = s.c_str(); Se vuoi modificare il buffer o usarlo dopo la cancellazione della string devi copiartelo da qualche parte. Per fare questo al posto dell'ultima riga devi scrivere char* buf = new char[ s.size() +1 ]; // occhio ! uno in piu' per lo '\0' memcpy( buf, s.c_str() , s.size()+1 ); Oppure piu' semplice ancora utilizzi la string direttamente P.S.: Come ha giustamente fatto osservare cionci, il valore di ritorno di una getline e' lo stream ! Fare qualcosa del tipo while( cin ) ha l'effetto che viene ritornato "true" se lo stream e' in buone condizioni , "false" altrimenti. Discorso opposto se usi while ( !cin ) ed e' per questo che il tuo ciclo non finiva mai ( una volta che il canale e' guasto tale resta e quindi la condizione del tuo ciclo viene sempre soddisfatta ). Ciao Marco |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2001
Città: Trento
Messaggi: 7095
|
Grazie, cosi' ho risolto il mio problema.
Ciao |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Me tapino
![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:57.