这个char数组到std :: string转换有什么问题?

时间:2014-08-11 09:25:21

标签: c++ string

我试图将char数组转换为std::string,但我只是在std::string中得到了胡言乱语。有什么问题?

char char_buff[40];
sprintf_s(char_buff, 40, "test" );
printf("%s\n", char_buff); // prints "test"

std::string str(char_buff);
printf("%s\n", str); // prints random nonsense

3 个答案:

答案 0 :(得分:12)

std::string传递给printf会产生未定义的行为。

当您尝试打印string个实例时,请尝试使用std::cout代替:

char char_buff[40];
sprintf_s(char_buff, 40, "test" );
std::cout << char_buff << "\n";

std::string str(char_buff);
std::cout << str << "\n";

答案 1 :(得分:1)

std::string str(char_buff);
printf("%s\n", str); // prints random nonsense

问题在于%s会使printf()期望const char*;换句话说,%sconst char*占位符

相反,您传递了str,这是std::string的实例,不是 a const char*

要解决此问题,只需使用c_str() std::string 方法:

printf("%s\n", str.c_str());

c_str()返回一个指向NUL终止字符串的C风格指针,正如printf()等C函数所期望的那样。


作为旁注:

char char_buff[40];
sprintf_s(char_buff, 40, "test" );

请注意,sprintf_s()可以更简单的形式使用,使其能够自动推断目标缓冲区长度,这要归功于一些模板&#34; magic&#34;:

sprintf_s(char_buff, "test");  // char_buff size automatically deduced

请参阅MSDN documentation中的sprintf_s()模板:

template <size_t size>
int sprintf_s(
   char (&buffer)[size],
   const char *format [,
   argument] ... 
); // C++ only

答案 2 :(得分:1)

不幸的是,printf是旧的c函数,并且不是类型安全的。它只是在你告诉它时解释给定的参数。

%s作为第一个出现的格式说明符you tell printf to interpret,将第一个参数用作char *,从而导致打印出乱码。

为了打印字符串的内容,您需要获取std :: string包装的char *数据。您可以使用.c_str()

执行此操作