Bunun std::cout
C ++ eşdeğeri olduğunu biliyorum printf
.
C ++ eşdeğeri sprintf
nedir?
Bunun std::cout
C ++ eşdeğeri olduğunu biliyorum printf
.
C ++ eşdeğeri sprintf
nedir?
Yanıtlar:
Misal:
#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;
}
Çıktı:
name: nemo, age: 1000
sprintf (...)
? Verileri keyfi olarak biçimlendiremezsiniz, <<
operatörü kullanarak akışa beslediğinizde bilinen türe güvenmeniz gerekir .
Güncelleme, Ağustos 2019:
C ++ 20'ye sahip olacak gibi görünüyor std::format
. Referans uygulaması {fmt} . printf()
Şimdi bir alternatif arıyorsanız , bu yeni "standart" yaklaşım olacaktır ve dikkate alınmaya değerdir.
Orijinal:
Boost.Format kullanın . It has printf
benzeri sözdizimi, tip güvenlik, std::string
sonuçlar ve diğer şık sürü. Geri dönmeyeceksin.
sprintf , C ++ 'da gayet iyi çalışır.
Çıktı akışını biçimlendirmek için iomanip başlık dosyasını kullanabilirsiniz. Bunu kontrol edin !
İşte bir c ++ sprintf için güzel bir işlev. Çok fazla kullanırsanız akışlar çirkinleşebilir.
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 ve sonraki sürümlerinde, std :: string bitişik depolama kullanmak garanti bununla biter '\0'
o için döküm yasal, yani char *
kullanarak &str[0]
.
Varyadik argümanların referans olarak geçişi takip etmemesi gerektiği ve c ++ 'nın gerekli değilse dizeleri kopyalamama konusunda iyi olduğu belirtildi. Bu durumda, bu onu düzeltir.
std::string string_format(std::string fmt, ...) {
sprintf
-usage'a daha yakın olacak şekilde .
(char*) str.c_str()
atıyor const
.
Tam olarak ne yapmayı planladığınıza bağlı olarak sprintf()
, std::to_string()
diğer seçeneklerden daha kullanışlı ve daha deyimsel olabilir:
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'nun temel avantajı , zorlaştırmayı sprintf()
hayal bile edemeyen ek türleri desteklemek için kolayca genişletilebilmesidir - Java'nın Object.toString()
yöntemi gibi .