web-dev-qa-db-fra.com

C ++ équivalent de sprintf?

Je le sais std::cout est l'équivalent C++ de printf.

Quel est l'équivalent C++ de sprintf?

70
lital maatuk

std::ostringstream

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
56
Vijay Mathew

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.

24
janm

sprintf fonctionne très bien en C++.

16
Steve Rowe

Vous pouvez utiliser le fichier d’en-tête iomanip pour formater le flux de sortie. Vérifiez this !

7
vinkris

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].

5
Erik Aronesty

Utilisez un stringstream pour obtenir le même effet. En outre, vous pouvez inclure <cstdio> et toujours utiliser snprintf.

0
regality

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. .

0
Guss