Преобразование строки в стиле C в C ++ std :: string - PullRequest
32 голосов
/ 22 января 2011

Каков наилучший способ преобразования строки в стиле C в C ++ std::string? В прошлом я делал это, используя stringstream s. Есть ли лучший способ?

Ответы [ 6 ]

51 голосов
/ 22 января 2011

C ++ строки имеют конструктор, который позволяет вам создать std::string непосредственно из строки в стиле C:

const char* myStr = "This is a C string!";
std::string myCppString = myStr;

Или, альтернативно:

std::string myCppString = "This is a C string!";

Как отмечает @TrevorHickeyв комментариях будьте осторожны, чтобы убедиться, что указатель, с которым вы инициализируете std::string, не является нулевым указателем.Если это так, приведенный выше код приводит к неопределенному поведению.Опять же, если у вас нулевой указатель, можно утверждать, что у вас даже нет строки вообще.: -)

10 голосов
/ 22 января 2011

Проверьте различные конструкторы класса строки: документация Вы можете быть заинтересованы в:

//string(char* s)
std::string str(cstring);

И

//string(char* s, size_t n)
std::string str(cstring, len_str);
5 голосов
/ 08 июля 2015

C++11: перегрузить оператор строкового литерала

std::string operator ""_s(const char * str, std::size_t len) {
    return std::string(str, len);
}

auto s1 = "abc\0\0def";     // C style string
auto s2 = "abc\0\0def"_s;   // C++ style std::string

C++14: используйте оператор из std::string_literals пространства имен

using namespace std::string_literals;

auto s3 = "abc\0\0def"s;    // is a std::string
4 голосов
/ 11 июля 2013

Если вы имеете в виду char* до std::string, вы можете использовать конструктор.

char* a;
std::string s(a);

Или, если string s уже существует, просто напишите это:

s=std::string(a);
4 голосов
/ 22 января 2011

Вы можете инициализировать std::string непосредственно из строки c:

std::string s = "i am a c string";
std::string t = std::string("i am one too");
1 голос
/ 10 мая 2014

В общем случае (без объявления нового хранилища) вы можете просто использовать конструктор 1-arg, чтобы изменить строку c в строку rvalue:

string xyz = std::string("this is a test") + 
             std::string(" for the next 60 seconds ") + 
             std::string("of the emergency broadcast system.");

Однако это не работает при построении строкичтобы передать его ссылкой на функцию (проблема, с которой я только что столкнулся), например,

void ProcessString(std::string& username);
ProcessString(std::string("this is a test"));   // fails

Вам необходимо сделать ссылку константной ссылкой:

void ProcessString(const std::string& username);
ProcessString(std::string("this is a test"));   // works.
...