68 votes

Rembourrage des chaînes STL en C++

Je suis en train d'utiliser std::string et j'ai besoin de les remplir à gauche pour une largeur donnée. Quelle est la méthode recommandée pour le faire en C++?

Entrée d'exemple:

123

remplir jusqu'à 10 caractères.

Sortie d'exemple:

       123

(7 espaces devant 123)

79voto

bayda Points 7454

Std::setw (setwidth) manipulateur

std::cout << std::setw (10) << 77 << std::endl;

ou

std::cout << std::setw (10) << "salut!" << std::endl;

affiche 77 et "salut!" avec des espacements.

si vous avez besoin du résultat en tant que chaîne de caractères, utilisez une instance de std::stringstream à la place de l'objet std::cout.

ps : le fichier d'en-tête responsable est

0 votes

Réponse impressionnante. Y aurait-il une chance d'obtenir ceci sous forme d'un exemple minimal fonctionnel? Merci

1 votes

Pour un simple std::to_string(n), utiliser stringstream semble être un surcoût...

0 votes

Code minimal fourni ci-dessous

52voto

Brian R. Bondy Points 141769
vide padTo(std::string &str, const size_t num, const char paddingChar = ' ')
{
    if(num > str.size())
        str.insert(0, num - str.size(), paddingChar);
}

int principal(int argc, char **argv)
{
    std::string str = "abcd";
    padTo(str, 10);
    return 0;
}

0 votes

J'aime cette solution parce que sur diverses saveurs de systèmes d'exploitation Linux, la chaîne de caractères string stream nécessite une dépendance GLIBC qui n'est pas disponible.

4 votes

Insert(0, ...) est une mauvaise idée car c'est lent, vous devez copier la chaîne à chaque fois que vous insérez un nouveau caractère.

0 votes

@arhuaco Pourquoi std::string::insert() ferait-il une copie? Il opère directement sur un tampon en place. Ce n'est pas Java/C#. Si vous voulez de mauvaises performances, optez pour n'importe quelle solution avec des flux...

26voto

Naveen Points 37095

Vous pouvez l'utiliser comme ceci :

std::string s = "123";
s.insert(s.begin(), paddedLength - s.size(), ' ');

22voto

greyfade Points 14358

La manière la plus simple à laquelle je peux penser serait avec un stringstream :

string foo = "foo";
stringstream ss;
ss << setw(10) << foo;
foo = ss.str();

foo devrait maintenant être rembourré.

11voto

Antti Huima Points 15465

Vous pouvez créer une chaîne contenant N espaces en appelant

string(N, ' ');

Donc vous pourriez faire comme ceci :

string to_be_padded = ...;
if (to_be_padded.size() < 10) {
  string padded(10 - to_be_padded.size(), ' ');
  padded += to_be_padded;
  return padded;
} else { return to_be_padded; }

0 votes

La meilleure réponse, mais horriblement formatée, difficile à lire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X