私はそれstd::cout
がC ++と同等であることを知っていますprintf
。にます。
C ++に相当するものは何sprintf
ですか?
私はそれstd::cout
がC ++と同等であることを知っていますprintf
。にます。
C ++に相当するものは何sprintf
ですか?
回答:
例:
#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;
}
出力:
name: nemo, age: 1000
sprintf (...)
ますか?データを任意にフォーマットすることはできません<<
。演算子を使用してデータをストリームにフィードするときに認識されているタイプに依存する必要があります。
更新、2019年8月:
C ++ 20にはが含まれるようstd::format
です。リファレンス実装は{fmt}です。あなたが探しているならprintf()
今代替案、これは新しい「標準的な」アプローチになり、検討する価値があります。
元の:
Boost.Formatを使用します。それは持っているprintf
様な構文、型の安全性、std::string
結果、および他の気の利いたものがたくさん。あなたは戻らないでしょう。
sprintfはC ++で問題なく動作します。
これがc ++ sprintfの素晴らしい関数です。ストリームを多用しすぎると、ストリームが醜くなる可能性があります。
std::string string_format(const 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;
}
}
C ++ 11以降では、STD ::文字列があることで両端を連続したストレージを使用することが保証されて'\0'
、それをキャストするために合法であるので、char *
使用します&str[0]
。
可変個引数は参照渡しに従うべきではないことが指摘されており、c ++は、必要がなければ文字列をコピーしないのが得意です。その場合、これで修正されます。
std::string string_format(std::string fmt, ...) {
sprintf
。
(char*) str.c_str()
ですconst
。
あなたが上で計画して正確に何によってsprintf()
ING、std::to_string()
便利および他のオプションよりも慣用的であるかもしれません。
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
std::to_string()
IMHOの主な利点は、sprintf()
JavaのObject.toString()
メソッドのように、文字列化を夢見ることさえできない追加の型をサポートするように簡単に拡張できることです。