如何在C ++ Sprintf 2nd(格式)参数中传递变量?

时间:2011-12-14 09:40:08

标签: c++

我一直在讨论如何在C ++中实现这一目标:

string format = "what is your %s";  
new_string = sprintf(buffer, format, name);

非常感谢任何帮助。

谢谢!

6 个答案:

答案 0 :(得分:4)

使用format.c_str()

string format = "what is your %s";  
int total = sprintf(buffer, format.c_str(), name);

另请注意,返回的值不是新字符串,而是 buffer ,它是输出字符串。返回的值实际上是写入的字符总数。此计数不包括自动附加在字符串末尾的附加空字符。失败时,会返回一个负数(see doc here)。

但是在C ++中,std::ostringstream更好,类型安全,正如@Joachim在他的回答中解释的那样。

答案 1 :(得分:3)

使用ostringstream

std::ostringstream os;
os << "what is your " << name;
std::string new_string = os.str();

答案 2 :(得分:2)

您可以随时执行以下操作:

char buffer[100]; 
string format = "what is your %s";
sprintf(buffer, format.c_str(), name.c_str());
string new_string(buffer);

或者,使用stringstream

stringstream buf;
buf << "what is your " << name;
string new_string = buf.str();

答案 3 :(得分:1)

传递给sprintf的格式必须是char*,而不是std::stringsprintf也返回写入的字符数,而不是指向构造缓冲区的指针。

int len = sprintf(buffer, "what is your%s", name);
std::string new_string(buffer, len);

另一种可能性是使用std::ostringstream来执行格式化。

答案 4 :(得分:0)

我不确定我是否理解这里的问题 - sprintf是一个函数,它将char*作为其第一个参数,而const char*作为其第二个参数。这些都是C数据类型,因此我不知道使用C ++字符串是否会被编译器识别为有效。

此外,该函数返回一个int(写入的字符数),而不是一个字符串,它看起来像你期望的返回值,如new_string

有关详细信息,请查看http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

答案 5 :(得分:-1)

您可以使用stringstream形成更多OO的C ++ STL。

查看documentation

sprintf是C库的一部分,因此对std :: string一无所知。如果您仍想使用它,请使用char *。

要从char*获取C std::string字符串,请使用c_str方法。