我试图将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
答案 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*
;换句话说,%s
是const 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()。
执行此操作