Discussione:
cin.getline() dopo il cin
(troppo vecchio per rispondere)
Aleander
2005-03-06 09:05:55 UTC
Permalink
Prima di tutto, buona domenica a tutti...

Ho riscontrato questo strano problema utilizzando di seguito cin, e poi
cin.getline;
in pratica se immetto una variabile tramite cin, e poi dopo c'è cin.getline,
oppure una serie di cin getline, il primo di questi mi viene saltato...

Ecco un esempio:

#include <iostream>

typedef char Stringa20[20];
using namespace std;
int main(){

int volte;
Stringa20 nome;
cout << "Quante volte vuoi ripetere il ciclo? ";

cin >> volte; //questo è il cin che sembra provochi il casino...

cout << endl;
cout << "Inserisci il tuo nome: ";

cin.getline(nome, 20);

/* l'attesa di input qui sopra viene saltata, e ho notato che questo avviene
per la presenza del cin qlc linea più sopra... infatti levandolo è tutto
ok.
Mi piacerebbe capire perchè accade, e quale può essere il modo di evitare
questo problema ( che nn sia quello di usare una istruzione cin.getline a
vuoto prima *_* !! )...
*/

system("PAUSE");

return 0;
}


Grazie in anticipo per l'aiuto,

Aleander
Noixe
2005-03-06 09:53:07 UTC
Permalink
Post by Aleander
#include <iostream>
typedef char Stringa20[20];
invece di usare un array di char includi <string> e usa il tipo string
Post by Aleander
cin.getline(nome, 20);
/* l'attesa di input qui sopra viene saltata, e ho notato che questo avviene
per la presenza del cin qlc linea più sopra... infatti levandolo è tutto
ok.
Mi piacerebbe capire perchè accade, e quale può essere il modo di evitare
questo problema ( che nn sia quello di usare una istruzione cin.getline a
vuoto prima *_* !! )...
*/
Guarda, io cin.getline non l'ho mai usato e non so se coincide con getline.
Se ti basta evitare il problema allora semplicemente fai:

string s;

getline (std::cin, s, '\n');

e l'input memorizza tutto in s fino a quando non premi invio.

Se invece vuoi sapere perche' cin.getline() si comporta in quel modo allora
speriamo che qualcun'altro legga il tuo post :P

Ciao
Cloud Strife
2005-03-06 10:19:51 UTC
Permalink
Post by Noixe
Post by Aleander
#include <iostream>
typedef char Stringa20[20];
invece di usare un array di char includi <string> e usa il tipo string
Post by Aleander
cin.getline(nome, 20);
/* l'attesa di input qui sopra viene saltata, e ho notato che questo
avviene
Post by Aleander
per la presenza del cin qlc linea più sopra... infatti levandolo è
tutto
Post by Aleander
ok.
Mi piacerebbe capire perchè accade, e quale può essere il modo di
evitare
Post by Aleander
questo problema ( che nn sia quello di usare una istruzione
cin.getline
a
Post by Aleander
vuoto prima *_* !! )...
*/
Guarda, io cin.getline non l'ho mai usato e non so se coincide con getline.
string s;
getline (std::cin, s, '\n');
e l'input memorizza tutto in s fino a quando non premi invio.
Se invece vuoi sapere perche' cin.getline() si comporta in quel modo allora
speriamo che qualcun'altro legga il tuo post :P
Ciao
Buongiorno,
guarda Noixe non credo che sia per quello perche' la funzione cin.getline
prevede per default il delimitatore di stringa \n. Quindi scrivere
cin.getline(stringa, num_max_di_caratteri, delimitatore'\n'); equivale a non
mettere il delimitatore \n stesso. Mi permetto di dire cio' solo perchè ho
trovato lo stesso problema che si e' posto il collega Aleander e non sono
riuscito a risolverlo nemmeno io.

grazie per l'attenzione
Cloud Strife
Noixe
2005-03-06 10:52:00 UTC
Permalink
Post by Cloud Strife
guarda Noixe non credo che sia per quello perche' la funzione cin.getline
prevede per default il delimitatore di stringa \n. Quindi scrivere
cin.getline(stringa, num_max_di_caratteri, delimitatore'\n'); equivale a non
mettere il delimitatore \n stesso. Mi permetto di dire cio' solo perchè ho
trovato lo stesso problema che si e' posto il collega Aleander e non sono
riuscito a risolverlo nemmeno io.
Se ti riferisci all'uso delle stringhe rispetto agli array di char quello e'
soprattutto un consiglio da applicare in generale. Per risolvere il vostro
problema la soluzione piu immediata che ho trovato e' quella di usare solo
getline senza cin, pero siccome getline acceta solo string si deve
convertire il numero in int. Scrissi tempo fa una semplice funzione che
converte da string a double e una piccola parte di essa posso applicarla
agli int:

#include <iostream>
#include <string>

int String2Int(string s) {
int n = 0, x = 1;
for (int i = 0; i < s.size(); i++) {
n += (s[s.size() - i - 1] - 48) * x;
x *= 10;
};
return n;
};

int main() {
int n = 0;
string s, nome;

std::cout << "Numero di cicli?" << std::endl;
getline(std::cin, s, '\n');

n = String2Int(s);

while (n--) {
std::cout << "Nome?" << std::endl;
getline(std::cin, nome, '\n');
};
return 0;
}


Ciao
Enrico Maria Giordano
2005-03-06 11:15:35 UTC
Permalink
Post by Aleander
Ho riscontrato questo strano problema utilizzando di seguito cin, e poi
cin.getline;
#include <iostream>

typedef char Stringa20[20];
using namespace std;
int main(){

int volte;
Stringa20 nome;
cout << "Quante volte vuoi ripetere il ciclo? ";

cin >> volte; //questo è il cin che sembra provochi il casino...

cout << endl;
cout << "Inserisci il tuo nome: ";

while ( cin.get() != '\n' );

cin.getline(nome, 20);

/* l'attesa di input qui sopra viene saltata, e ho notato che questo
avviene
per la presenza del cin qlc linea più sopra... infatti levandolo è
tutto
ok.
Mi piacerebbe capire perchè accade, e quale può essere il modo di
evitare
questo problema ( che nn sia quello di usare una istruzione
cin.getline a
vuoto prima *_* !! )...
*/

system("PAUSE");

return 0;
}

EMG

--
EMAG Software Homepage: http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: http://www.emagsoftware.it/tbosg
Noixe
2005-03-06 11:55:59 UTC
Permalink
Post by Enrico Maria Giordano
while ( cin.get() != '\n' );
cin.getline(nome, 20);
Ah, bastava mettere quel while? Pensavo che si dovesse svuotare il buffer o
roba simile.
Enrico Maria Giordano
2005-03-06 13:42:59 UTC
Permalink
Post by Noixe
Post by Enrico Maria Giordano
while ( cin.get() != '\n' );
Ah, bastava mettere quel while? Pensavo che si dovesse svuotare il
buffer o roba simile.
Per l'appunto quel while svuota lo stream di input fino al '\n'.

EMG

--
EMAG Software Homepage: http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: http://www.emagsoftware.it/tbosg
Noixe
2005-03-06 12:01:13 UTC
Permalink
Post by Enrico Maria Giordano
while ( cin.get() != '\n' );
cin.getline(nome, 20);
Un'altra cosa: come mai se si usano 2 cin >> in sequenza (cioe' leggendo i 2
inpunt con cin e senza cin.getline()) non c'e' nessun salto?

Ciao
Noixe
2005-03-06 12:39:20 UTC
Permalink
Post by Noixe
Un'altra cosa: come mai se si usano 2 cin >> in sequenza (cioe' leggendo i 2
inpunt con cin e senza cin.getline()) non c'e' nessun salto?
Va be 3 post per dire una cosa :(

Cmq, per caso cin dopo aver premuto invio, lascia un carattere di newline?
Infatti sia cin.getline che getline escono subito se messi subito dopo un
cin.
Enrico Maria Giordano
2005-03-06 13:44:11 UTC
Permalink
Post by Noixe
Cmq, per caso cin dopo aver premuto invio, lascia un carattere di newline?
Certo.

EMG

--
EMAG Software Homepage: http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: http://www.emagsoftware.it/tbosg

Horst Kraemer
2005-03-06 13:01:04 UTC
Permalink
Post by Noixe
Post by Enrico Maria Giordano
while ( cin.get() != '\n' );
cin.getline(nome, 20);
Un'altra cosa: come mai se si usano 2 cin >> in sequenza (cioe' leggendo i 2
inpunt con cin e senza cin.getline()) non c'e' nessun salto?
perqué il secondo cin<<i mangia il '\n' della prima riga.

cin<<a<<b<<c;

Input:

1 <ENTER>2 <ENTER> 3 <ENTER>


cin<<a mangia " " e legge "1"

cin<<b mangia " <ENTER>" e legge "2"

cin<<c mangia " <ENTER> " e legge "3"
--
Horst
Aleander
2005-03-06 13:39:28 UTC
Permalink
Post by Aleander
Post by Aleander
Ho riscontrato questo strano problema utilizzando di seguito cin, e poi
cin.getline;
#include <iostream>
cout << endl;
cout << "Inserisci il tuo nome: ";
while ( cin.get() != '\n' );
Non sei mica così gentile da spiegarmi anche il senso di ciò?
Cioè nn è lo stesso che mettere un cin.getline() a vuoto ?
(la qual cosa reputo poco corretta formalmente o, come si dalle mie parti,
un pezzotto)


Aleander
Continua a leggere su narkive:
Loading...