Является ли std :: string лучшей идеей, чем char *, когда вам нужно передать его как char *? - PullRequest
4 голосов
/ 03 ноября 2010

В недавнем вопросе я узнал, что есть ситуации, когда вам просто нужно пройти char* вместо std::string. Мне действительно нравится string, и для ситуаций, когда мне просто нужно передать неизменяемую строку, он прекрасно работает с .c_str(). На мой взгляд, это хорошая идея - воспользоваться строковым классом для простоты его манипулирования. Тем не менее, для функций, которые требуют ввода, я в конечном итоге сделать что-то вроде этого:

std::string str;
char* cstr = new char[500]; // I figure dynamic allocation is a good idea just
getstr(cstr);               // in case I want the user to input the limit or
str = cstr;                 // something. Not sure if it matters.
delete[] cstr;
printw(str.c_str());

Очевидно, это не так просто. Теперь я довольно новичок в C ++, поэтому я не могу видеть лес за деревьями. В такой ситуации, когда каждый вход должен быть преобразован в строку C и обратно, чтобы воспользоваться полезными методами string, это просто лучшая идея, чтобы разобраться и привыкнуть к стилю C манипуляции со строками? Не слишком ли глупы такие постоянные преобразования туда-сюда?

Ответы [ 2 ]

3 голосов
/ 03 ноября 2010

В приведенном вами примере вы, как правило, можете прочитать строку в std::string, используя функцию std::getline: http://www.cplusplus.com/reference/string/getline/

Конечно, это не все, что проклятиябиблиотека делает.Если вам нужен неконстантный char*, чтобы некоторые функции C могли читать в нем, вы можете использовать vector<char>.Вы можете создать vector<char> из string, и наоборот:

std::string       a("hello, world");
std::vector<char> b(a.begin(), a.end());

// if we want a string consisting of every byte in the vector
std::string       c(b.begin(), b.end());

// if we want a string only up to a NUL terminator in the vector
b.push_back(0);
std::string       d(&b[0]);

Итак, ваш пример:

std::vector<char> cstr(500);
getnstr(&cstr[0], 500);
printw(&cstr[0]);
1 голос
/ 03 ноября 2010

Большинство реализаций std :: string :: c_str () (если не все) просто возвращают указатель на внутренний буфер. Никаких накладных расходов.

Остерегайтесь, однако, что c_str () возвращает const char*, а не символ *. И этот указатель станет недействительным после вызова функции. Поэтому вы не можете использовать его, если функция выполняет что-то вроде обратной записи в переданную строку или создает копию указателя.

...