où commencer ...
(1) Tout d'abord, un gets
attend char*
, mais std::string::c_str()
retours const char*
. Le but de std::string::c_str()
est simplement de fournir une représentation C-chaîne des données de chaîne - il n'est pas destiné à fournir un tampon inscriptible.La fonction gets
a besoin d'un tampon de caractères en écriture.
(2) En second lieu, vous pouvez utiliser std::string
comme un tampon de caractères en écriture en utilisant l'opérateur []
, en disant: versions
std::string s(100); // create a buffer of size 100
char* buf = &s[0];
Ceci est garanti pour fonctionner correctement dans 11 C de, mais dans les versions antérieures de C++, il n'est pas nécessairement garanti que std::string
fournisse un tampon mémoire contigu. (Bien que, dans la pratique, il le fait presque toujours.) Pourtant, si vous voulez un tampon, il est préférable d'utiliser std::vector<char>
.
(3) Enfin, n'utilisez pas gets
, JAMAIS. C'est ridiculement dangereux et rend votre programme vulnérable aux débordements de buffer et aux attaques par injection de shellcode. Le problème est que gets
n'inclut pas un paramètre size
, donc en pratique le programme lira toute quantité arbitraire d'octets dans le tampon, potentiellement débordant le tampon et résultant en un comportement indéfini. Cela a été historiquement un vecteur d'attaque pour de nombreux pirates, especially when gets
is used with a stack array. La fonction fgets
doit être utilisée à la place en C, car elle vous permet de spécifier un paramètre de taille de lecture maximale. En C++, il est préférable d'utiliser std::getline
, car cela fonctionne directement avec un objet std::string
et donc vous n'avez pas besoin de vous soucier de la taille du tampon.
Un mot: "Ne pas utiliser' gets'. " –
@KerrekSB C'est trois, sans doute quatre mots. – orlp
Utilisez ['std :: getline'] (http://fr.cppreference.com/w/cpp/string/basic_string/getline) au lieu de – Praetorian