2013-08-22 3 views
2

Я хочу использовать функцию gets() для std::string str. Но я получаю сообщение об ошибке:use std :: string as character array

invalid conversion from 'const char*' to 'char*'

strlen() функция с другой стороны не дает какую-либо ошибку, когда я пишу

int len = strlen(str.c_str()) 

но gets(NUM.c_str()) дает ошибку.

Любые предложения? Мне нужно использовать std::string и gets(), так как мой размер персонажа неизвестен.

+0

Одно слово: «Не использовать' gets'. " –

+4

@ KerrekSB Это три, возможно четыре слова. – orlp

+0

Использовать ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) вместо – Praetorian

ответ

9

c_str() возвращает указатель const на содержимое строки, поэтому вы не можете использовать его для изменения строки.

Даже если вы сделали, что обойти (который вы действительно не должны), было бы невозможно изменить размер строки (как вы пытаетесь сделать), так что это управляется string объекта. Лучшее, что вы могли бы сделать, это записать по памяти, которая не может принадлежать string, вызывая сбои или другое неопределенное поведение.

Даже если у вас есть подходящий массив для записи, не используйте gets. Невозможно предотвратить переполнение буфера, если строка ввода слишком длинная. Это было устаревшим в C, так как, по крайней мере 1999

Any suggestions?

std::getline(std::cin, NUM); 
0

I want to use gets() function

gets() является C. Когда это возможно, лучше с помощью C++ показывает

Вместо того, чтобы попытаться getline как это: -

std::getline(std::cin, NUM); 

И как Джрки упоминались в комментариях: -

Сделать мир лучше - не использовать получает

+1

Не используйте 'get' в C либо. Это устарело, потому что причина разума. –

+0

Да, я полностью согласен. Я никогда не использую это слишком !!! :) –

+0

Спасибо !!! .... сделано !!!! – Sucho

0

В дополнение к проблемам, с попытками использовать gets в первую очередь, вы не можете использовать его на буфер возвращается из c_str() в буфер является . Const символ * (который указывает на буфер строк, принадлежащих std::string объекта Если вы настаиваете на использовании gets(), вам нужно будет создать свой собственный буфер для чтения в:

char buffer[1024] = {0}; // temporary buffer 
gets(buffer); // read from stdin into the buffer 
std::string s(buffer); // store the contents of the buffer in a std::string 

для объяснения и пример того, почему вас Shou л.д. никогда не использовать gets: http://www.gidnetwork.com/b-56.html

Гораздо лучше подход к

std::string s; // the std::string you are using 
std::getline(std::cin, s); // read the line 
5

Где начать ...

(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, поэтому вам не нужно беспокоиться о размере буфера.