用constchar*初始化std::string会导致胡言乱语

Initializing std::string with const char * results in gibberish

本文关键字:胡言乱语 string 初始化 std constchar      更新时间:2023-10-16

我使用rapidjson读取JSON文件,其中一些值是字符串。现在,rapidjson的GetString()方法返回一个const char *。不过,我想把它存储在std::string中。我试过这个:

const char* foo = d["foo"].GetString();
printf("Foo: %sn", foo); // Prints correctly
std::string fooStr(foo);
printf("FooString: %sn", fooStr); // Gibberish

如何获得正确的std::string

不能将std::string直接传递给printf。它是一个C风格的可变函数,只适用于C兼容的类型,而不是(非平凡的)C++类。特别是,%s说明符要求其匹配参数是指向const char *类型的C样式字符串(以零结尾的字符数组)的指针。

您可以使用C++流:

std::cout << "FooString: " << fooStr << 'n';

或者从字符串中提取C样式指针:

printf("FooString: %sn", fooStr.c_str());

您还应该启用编译器警告;这应该能告诉你到底出了什么问题。

要将字符串转换为常量字符*,请使用string::c_str()