当我编译这样的东西时,我收到警告......
std::string something = "bacon";
sprintf("I love %s a lot", something.c_str());
它表示“警告:已弃用从字符串常量转换为'char *'。我尝试将文本转换为...
const char *
相反,但我得到一个不同的错误。如果有更好的选择,我不会致力于sprintf。
答案 0 :(得分:6)
要使sprintf
起作用,您需要提供一个足够大的char
数组,以便将结果写为第一个参数。
但是,您可以(而且应该!)只使用更容易operator+
的C ++字符串:
std::string res = "I love " + something + " a lot";
答案 1 :(得分:4)
sprintf("I love %s a lot", something.c_str);
在该代码中,您应该使用正确的函数调用something.c_str()
语法调用()
。
另请注意,sprintf()
的上述用法是错误的,因为您没有为生成的格式化字符串提供有效的目标字符串缓冲区。
此外,出于安全原因,您应该使用更安全 snprintf()
而不是sprintf()
。事实上,使用snprintf()
,您可以指定目标缓冲区的 size ,以避免缓冲区溢出。
以下可编译代码是snprintf()
用法的示例:
#include <stdio.h>
#include <string>
int main()
{
std::string something = "bacon";
char buf[128];
snprintf(buf, sizeof(buf), "I love %s a lot", something.c_str());
printf("%s\n", buf);
}
<强> P.S。强>
通常,在C ++中,您可以考虑使用std::string::operator+
进行字符串连接,例如:
std::string result = "I love " + something + " a lot";
答案 2 :(得分:-4)
它看起来不像正确使用sprintf。 第一个参数应该是一个已经有后备内存的char *。 例如:
char *str = malloc (BUFSIZ);
sprintf (str, "I love %s a lot", something.c_str);