2009-04-01 4 views
1

Dire que je veux imprimer:Impression d'un numéro personnalisé de délimiteurs d'en-tête basé sur la longueur du message

============ 
Some message 
============ 

Et:

======================= 
Other Message long one 
======================= 

Le nombre de « = » modifications en fonction de la longueur du message. Quel est le moyen le plus efficace d'imprimer ce genre de chose?

Pas de boost, juste STL s'il vous plait.

+0

Quel est le problème avec une boucle for qui imprime en fonction de la longueur de votre message? – CookieOfFortune

+0

Rien ne va pas avec elle :) –

Répondre

7
std::string line(msg.length(), '='); 
cout << line << "\n" << msg << "\n" << line << endl; 
+0

nice ............. –

2

Vous ne spécifiez pas comment vous mesurez "l'efficacité" dans ce contexte. Voici une solution qui est efficace en termes de code, vous devez écrire et nombre d'allocations:

#include <string> 
#include <iostream> 

using namespace std; 

void format(const std::string& msg) 
{ 
    std::string banner(msg.length(), '='); 
    cout << banner << endl 
     << msg << endl 
     << banner << endl; 
} 

int main(int argc, char *argv[]) 
{ 
    format("Some message"); 
    format("Other message long one"); 
    return 0; 
} 

Je peux imaginer d'autres solutions qui évitent allouer une chaîne temporaire pour les bannières, mais ceux qui pourraient venir à un coût accru de la impression réelle.

2

variante iomanip, juste pour le plaisir.

const std::string hello("hello world!"); 
std::cout << std::setfill('=') << std::setw(hello.length() + 1) << "\n" 
      << hello << "\n"; 
      << std::setfill('=') << std::setw(hello.length() + 1) << "\n"; 
+0

Ne va pas mettre ce plaisir dans le code de production ... il faut penser +1 –

+0

+1 pour ne pas utiliser '\ n 'et pas cher endl! –

+0

endl - tampon de vidage, nous devrions l'utiliser quand il le faut, pas n'importe où. – bayda

Questions connexes