Newsgroup: it.comp.lang.c++
Titolo: leggere stringa con getline o cin >>, differenze?

Ciao, mi è capitata una cosa strana (che sicuramente non so io, ma mi ha
colpito...).
E' un esempio banale che stavo scrivendo per rispondere ad un dubbio di un
amico principiante ma alla fine sono rimasto suonato io!!
// ... codice ...
// chiede password, poi verifica
std::string user_passwd;
std::string passwd(6,'*');
std::cout << "Enter Skill Password: ";
// std::cin >> user_passwd;
std::getline(cin,user_passwd);
if (strcmp(user_passwd.c_str(),passwd.c_str())!=0) {
                cout << "NO\n";
                exit(-1);
        } else cout << "SI\n";
// continua programma se autorizzato
Come mai se scrivo come password i sei asterischi (risposta esatta, che
permette di proseguire) e la leggo con getline() il confronto tra stringhe
user_passwd!=passwd (cioè if (user_passwd!=passwd) dice che è sempre vero e
quindi risponde sempre NO.
Mentre nella versione con strcmp il confronto tra user_passwd e passwd viene
eseguito correttamente.
Se invece togo il getline e uso la riga commentata (cin >> user_passwd) ecco
che allora il confronto fra le stringhe funziona.
Come mai insomma con getline devo usare strcmp e non l'operatore != tra
string e invece con cin >> invece va?
C'è qualcosa che non so? L'esempio lo stavo facendo con il Borland C++
builder 5.
Grazie a tutti,
Paolo.

 wrote in message
bdd1j6$p0a$1...@lacerta.tiscalinet.it...

Secondo me dipende dal codice che c'è prima. Sei sicuro che la getline ti
prende la password? Hai provato a mandarla in output per vedere cosa
contiene in realtà user_passwd oppure hai verificato dal debugger? Occhio
perchè a me risulta che getline prende tutto quello che c'è fino al
carattere /n, se prima di quel punto hai fatto operazioni di input che
leggono ma non rimuovono i caratteri terminatori /n (come l'operatore >>) ti
rimane uno /n nel buffer e di conseguenza il getline legge una stringa
vuota, mentre la password digitata rimane nel buffer. L'operatore >> se la
gestisce da solo questa menata.
Se è questo il problema, come soluzione puoi fare una cin.ignore().

 contiene in realtà user_passwd oppure hai verificato dal debugger? Occhio
Il debbugger (il Borland Builder ha un ottimo debugger, dice che e' tutto a
posto...) ho compilato l'esempio con il Mingw32 (uso anche il Dev-c++) e va
bene... quando mi ricapita ci riguardo adesso non ho tempo, però ci sono
rimasto male... chissà come mai...
Grazie comunque per l'aiuto.

 ha scritto nel messaggio
news:bdffhc$r21$1...@lacerta.tiscalinet.it...
Comunque te lo confermo, quel segmento di codice è all'inizio del programma
ed è solo un esempio di stupida lettura di una password, è il primo input
che si fa e col mio Borland C++ Builder 5 NON VA!!
Funziona invece (che ho provato ora), il seguente codice!
Anche in questo caso, sostituire il cin.get() con un getline(cin, string),
l'if fallisce, apparentemente la stringa letta dalla getline è identica
all'altra però poi da qualche parte dentro string.stl e memory.stl il
programma si perde...
Ho provato a seguirlo un pò col debugger ma poi mi sono rotto...
#include <iostream>
#include <fstream>
#include <string>
#include <cassert>
using namespace std;
int main(int argc, char* argv[])
{
        char user_passwd[80];
        string passwd(6,'*');
        cout << "Enter Skill Password: ";
        cin.get(user_passwd,80);
        if (string(user_passwd)!=passwd) {
                cout << "Access Denied\n";
                exit(-1);
        } else cout << "Access granted!\n\n\n";
// ... resto del codice !!

 wrote in message
bdfi6k$sf1$1...@lacerta.tiscalinet.it...

Fai una verifica semplice:
cout<< user_passwd<<" "<<passwd;
per capire dove sono le differenze tra le due.
E poi vediamo di capire il perché......