Je le sais std::cout
est l'équivalent C++ de printf
.
Quel est l'équivalent C++ de sprintf
?
Exemple:
#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;
}
Sortie:
name: nemo, age: 1000
Mise à jour, août 2019:
Il semble que C++ 20 aura std::format
. L'implémentation de référence est {fmt} . Si vous recherchez une alternative printf()
maintenant, elle deviendra la nouvelle approche "standard" et mérite d'être envisagée.
Original:
Utilisez Boost.Format . Il a la syntaxe semblable à printf
-, le type safety, les résultats std::string
Et beaucoup d'autres choses astucieuses. Vous ne reviendrez pas.
sprintf fonctionne très bien en C++.
Vous pouvez utiliser le fichier d’en-tête iomanip pour formater le flux de sortie. Vérifiez this !
Voici une fonction intéressante pour un sprintf c ++. Les cours d'eau peuvent devenir laids si vous les utilisez trop.
std::string string_format(const std::string &fmt, ...) {
int n, 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)
return str;
if (n > -1)
size = n + 1;
else
size *= 2;
}
}
Dans C++ 11 et versions ultérieures, il est garanti que std :: string utilise un stockage contigu se terminant par '\0'
, il est donc légal de le lancer en char *
en utilisant &str[0]
.
Utilisez un stringstream pour obtenir le même effet. En outre, vous pouvez inclure <cstdio>
et toujours utiliser snprintf.
Selon ce que vous prévoyez exactement sur sprintf()
, std::to_string()
peut être utile et plus idiomatique que d'autres options:
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
Le principal avantage de std::to_string()
, à mon humble avis, est qu’il peut être facilement étendu pour prendre en charge des types supplémentaires que sprintf()
ne peut même pas rêver de stigmatiser - un peu comme la méthode Object.toString()
de Java. .