Reputation: 6249
I know that std::cout
is the C++ equivalent of printf
.
What is the C++ equivalent of sprintf
?
Upvotes: 108
Views: 120462
Reputation: 27184
Example:
#include <iostream>
#include <sstream> // for ostringstream
#include <string>
int main()
{
std::string name = "nemo";
int age = 1000;
std::ostringstream out;
out << "name: " << name << ", age: " << age;
std::cout << out.str() << '\n';
return 0;
}
Output:
name: nemo, age: 1000
Upvotes: 80
Reputation: 12915
Here's a nice function for a c++ sprintf. Streams can get ugly if you use them too heavily.
std::string string_format(std::string fmt, ...) {
int size=100;
std::string str;
va_list ap;
while (1) {
str.resize(size);
va_start(ap, fmt);
int n = vsnprintf(&str[0], size, fmt.c_str(), ap);
va_end(ap);
if (n > -1 && n < size) {
str.resize(n); // Make sure there are no trailing zero char
return str;
}
if (n > -1)
size = n + 1;
else
size *= 2;
}
}
In C++11 and later, std::string is guaranteed to use contiguous storage that ends with '\0'
, so it is legal to cast it to char *
using &str[0]
.
Upvotes: 11
Reputation: 18349
Update, August 2019:
It looks like C++20 will have std::format
. The reference implementation is {fmt}. If you are looking for a printf()
alternative now, this will become the new "standard" approach and is worth considering.
Original:
Use Boost.Format. It has printf
-like syntax, type safety, std::string
results, and lots of other nifty stuff. You won't go back.
Upvotes: 44
Reputation: 32354
Depending on what exactly you plan on sprintf()
ing, std::to_string()
might be useful and more idiomatic than other options:
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
The main advantage of std::to_string()
, IMHO, is that it can be extended easily to support additional types that sprintf()
can't even dream of stringifying - kind of like Java's Object.toString()
method.
Upvotes: 2
Reputation: 6554
Use a stringstream to achieve the same effect. Also, you can include <cstdio>
and still use snprintf.
Upvotes: -2