Alternative Ssortingng.Format en C ++

Je n’ai pas beaucoup d’expérience avec C ++. J’ai plutôt travaillé davantage en C # et je voulais donc poser ma question en rapportant ce que j’aurais fait là-dedans. Je dois générer un format spécifique de la chaîne, que je dois transmettre à une autre fonction. En C #, j’aurais facilement généré la chaîne à l’aide du code simple ci-dessous.

ssortingng a = "test"; ssortingng b = "text.txt"; ssortingng c = "text1.txt"; Ssortingng.Format("{0} {1} > {2}", a, b, c); 

En générant une telle chaîne, je devrais pouvoir passer ceci dans system() . Cependant, le system accepte uniquement char*

Je suis sur Win32 C++ (pas C ++ / CLI), et je ne peux pas utiliser boost car cela inclurait trop d’inclusion de tous les fichiers pour un projet qui est très petit. Quelque chose comme sprintf() me semble utile, mais sprintf n’accepte pas la ssortingng tant que parameters a, b et c . Des suggestions sur la façon dont je peux générer ces chaînes formatées à transmettre au système dans mon programme?

Vous pouvez utiliser sprintf en combinaison avec std::ssortingng.c_str() .

c_str() retourne un caractère const char* et fonctionne avec sprintf :

 ssortingng a = "test"; ssortingng b = "text.txt"; ssortingng c = "text1.txt"; char* x = new char[a.length() + b.length() + c.length() + 32]; sprintf(x, "%s %s > %s", a.c_str(), b.c_str(), c.c_str() ); ssortingng str = x; delete[] x; 

ou vous pouvez utiliser un tableau de caractères pré-alloué si vous connaissez la taille:

 ssortingng a = "test"; ssortingng b = "text.txt"; ssortingng c = "text1.txt"; char x[256]; sprintf(x, "%s %s > %s", a.c_str(), b.c_str(), c.c_str() ); 

La manière C ++ serait d’utiliser un object std::ssortingngstream tant que:

 std::ssortingngstream fmt; fmt << a << " " << b << " > " << c; 

La méthode C consisterait à utiliser sprintf .

La voie C est difficile à obtenir puisque:

  • C'est type dangereux
  • Nécessite une gestion de la mémoire tampon

Bien sûr, vous pouvez vouloir ssortingngstream à la méthode C si les performances posent problème (imaginez que vous créez des millions d’objects ssortingngstream taille fixe que vous ssortingngstream ensuite).

Par souci d’exhaustivité, vous pouvez utiliser std::ssortingngstream :

 #include  #include  #include  int main() { std::ssortingng a = "a", b = "b", c = "c"; // apply formatting std::ssortingngstream s; s << a << " " << b << " > " << c; // assign to std::string std::string str = s.str(); std::cout << str << "\n"; } 

Ou (dans ce cas), les capacités de concaténation de chaînes propres à std::ssortingng :

 #include  #include  int main() { std::ssortingng a = "a", b = "b", c = "c"; std::ssortingng str = a + " " + b + " > " + c; std::cout << str << "\n"; } 

Pour référence:


Si vous voulez vraiment aller dans la voie C. Vous voilà:

 #include  #include  #include  #include  int main() { std::ssortingng a = "a", b = "b", c = "c"; const char fmt[] = "%s %s > %s"; // use std::vector for memory management (to avoid memory leaks) std::vector::size_type size = 256; std::vector buf; do { // use snprintf instead of sprintf (to avoid buffer overflows) // snprintf returns the required size (without terminating null) // if buffer is too small initially: loop should run at most twice buf.resize(size+1); size = std::snprintf( &buf[0], buf.size(), fmt, a.c_str(), b.c_str(), c.c_str()); } while (size+1 > buf.size()); // assign to std::ssortingng std::ssortingng str = &buf[0]; std::cout << str << "\n"; } 

Pour référence:


Ensuite, il y a la bibliothèque de formats Boost . Par souci de votre exemple:

 #include  #include  #include  int main() { std::ssortingng a = "a", b = "b", c = "c"; // apply format boost::format fmt = boost::format("%s %s > %s") % a % b % c; // assign to std::ssortingng std::ssortingng str = fmt.str(); std::cout << str << "\n"; } 

En plus des options suggérées par d’autres, je peux recommander la bibliothèque fmt qui implémente un formatage de chaîne similaire à str.format en Python et Ssortingng.Format en C #. Voici un exemple:

 std::ssortingng a = "test"; std::ssortingng b = "text.txt"; std::ssortingng c = "text1.txt"; std::ssortingng result = fmt::format("{0} {1} > {2}", a, b, c); 

Disclaimer: Je suis l’auteur de cette bibliothèque.

Pour être complet, la méthode booster consisterait à utiliser boost::format

 cout << boost::format("%s %s > %s") % a % b % c; 

Faites votre choix. La solution boost présente l’avantage de la sécurité de type avec le format sprintf (pour ceux qui trouvent la syntaxe << un peu maladroite).

Comme déjà mentionné, la méthode C ++ utilise des chaînes de caractères.

 #include  ssortingng a = "test"; ssortingng b = "text.txt"; ssortingng c = "text1.txt"; std::ssortingngstream ostr; ostr << a << " " << b << " > " << c; 

Notez que vous pouvez obtenir la chaîne C à partir de l’object ssortingng stream comme suit.

 std::ssortingng formatted_ssortingng = ostr.str(); const char* c_str = formatted_ssortingng.c_str(); 

Vous pouvez simplement concaténer les chaînes et créer une ligne de commande.

 std::ssortingng command = a + ' ' + b + " > " + c; system(command.c_str()); 

Vous n’avez pas besoin de bibliothèques supplémentaires pour cela.