[C++]Fun with getline()

Ploum, c’est encore moi les geeks, toujours dans la série “jouons avec le C++”. Aujourd’hui au programme je sèche sur l’utilisation correcte de la fonction cin.getline()

Le but est de rédéfinir l’opérateur d’extraction pour une classe Personne (EDIT: avec un nom et un prénom qui sont des char* et non des strings), de manière à pouvoir faire “cin >> MonObjetPersonne”.

[codebox]istream& operator>>(istream& input, Personne& temp){
char buffer[50];

cout << "Nom ?" << endl;
cin.ignore(50, '\n');
cin.getline(buffer, 50);
temp.setNom(buffer);

cout << "Prénom ?" << endl;
cin.getline(buffer, 50);
temp.setPrenom(buffer);

    //ça marche si je tape 'Test' et puis 'Test' mais pas si je tape 'Teeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeest' et puis 'Test'

}[/codebox]

Le problème: ça fonctionne si l’entrée au clavier ne dépasse pas 50 caractères, mais si ça dépasse la taille de buffer alors les entrées suivantes au clavier ne passent pas: c’est comme si je tapais directement entrée à chaque fois. Si je refais un cin.ignore après ça ne marche pas non plus: je dois appuyer 2 fois sur enter pour valider une entrée.

J’attends vos lancers de cailloux.

J’ai écrit ça vite fait, c’est pas fantastiquement beau mais ça doit répondre à ta question. Je suis un chouïa rouillé en C++ ces temps-ci (saleté de C :smiley: ), désolé si ce n’est pas optimum:

[code]#include
#include

class Personne {
public:
Personne()
{}
void setNom(const std::string& nom)
{
nom_ = nom;
}
void setPrenom(const std::string& prenom)
{
prenom_ = prenom;
}
std::string getNom() const
{
return nom_;
}
std::string getPrenom() const
{
return prenom_;
}
private:
std::string nom_;
std::string prenom_;
};

std::istream& operator>>(std::istream& input, Personne& personne)
{
std::string nom;
input >> nom;
personne.setNom(nom);

std::string prenom;
input >> prenom;
personne.setPrenom(prenom);

return input;

}

std::ostream& operator<<(std::ostream& output, Personne& personne)
{
output << personne.getPrenom() << " " << personne.getNom();
return output;
}

int main(int argc, char *argv[])
{
Personne personne;

std::cin >> personne;
std::cout << personne;

}

// Input: Bond James
// Output: James Bond[/code]

Merci mon cher Doc Toise mais j’ai bien peur que tu te sois donné du mal pour rien : le problème est que dans mon cas je dois utiliser des char* pour nom et prénom, au lieu de la classe string. J’aurais du préciser que c’est la même classe que dans mon autre thread, au temps pour moi.

Tu peux convertir les strings en char* avec c_str() (ou data() suivant si tu veux le caractère de terminaison ou pas) dans la méthode de Doc Toise.

Il n’y a pas de modification de la string entre la saisie et le c_str() donc pas d’invalidation du pointeur de la string. :smiley:

[code]std::istream& operator>>(std::istream& input, Personne& personne)
{
std::string nom;
input >> nom;
personne.setNom(nom.c_str());

std::string prenom;
input >> prenom;
personne.setPrenom(prenom.c_str());

return input;

}[/code]

Tout cela évidement si tu veux/peux utiliser les strings le temps de la saisie.