Где начать ...
(1) Во-первых, gets
ожидает char*
, но std::string::c_str()
возвращает const char*
. Цель std::string::c_str()
состоит в том, чтобы предоставить представление строковых данных в C-строках - оно НЕ предназначено для обеспечения записываемого буфера.Для функции gets
необходим доступный для записи буфер символов.
(2) Во-вторых, вы можете использовать std::string
как перезаписываемый символьного буфера с помощью оператора []
, говоря:
std::string s(100); // create a buffer of size 100
char* buf = &s[0];
Это гарантированно работать должным образом в C++ 11, однако в более ранних версиях C++, не обязательно гарантируется, что std::string
обеспечивают непрерывный буфер памяти. (Хотя на практике это почти всегда делает.) Тем не менее, если вам нужен буфер, лучше использовать std::vector<char>
.
(3) Наконец, не используйте gets
, КОГДА-ЛИБО. Это смешно опасно и делает вашу программу склонной к переполнению буфера и атакам инъекции шелка. Проблема в том, что gets
не включает параметр size
, поэтому на практике программа будет считывать произвольное количество байтов в буфер, потенциально переполняя буфер и приводя к неопределенному поведению. Это исторически было вектором атаки для многих хакеров, especially when gets
is used with a stack array. Функция fgets
следует использовать вместо этого в C, поскольку она позволяет указать максимальный параметр размера чтения. В C++ лучше использовать std::getline
, потому что он работает напрямую с объектом std::string
, поэтому вам не нужно беспокоиться о размере буфера.
Одно слово: «Не использовать' gets'. " –
@ KerrekSB Это три, возможно четыре слова. – orlp
Использовать ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) вместо – Praetorian