View Full Version : 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:eek:
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...
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
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)...
Grazie 1000. Lo provo e ti so dire.
Ciao
/\/\@®¢Ø
23-01-2002, 21:05
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
Grazie, cosi' ho risolto il mio problema.
Ciao
Me tapino ;) Alla STL non ci penso mai ! Eppure fanno comodo a volte (purtroppo eredità del C) :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.