将字符串插入另一个字符串...(sprintf)

时间:2016-02-05 17:20:46

标签: c++ string printf

当我编译这样的东西时,我收到警告......

std::string something = "bacon";

sprintf("I love %s a lot", something.c_str());

它表示“警告:已弃用从字符串常量转换为'char *'。我尝试将文本转换为...

const char *

相反,但我得到一个不同的错误。如果有更好的选择,我不会致力于sprintf。

3 个答案:

答案 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);