Możesz użyć std::ostringstream. Biblioteki strumieni dla C++ warto się nauczyć. W połączeniu z formatowaniem pola ( std::setw(...) ), daje możliwość osiągnięcia tego czego chcesz. Dodatkowo std::string posiada konstruktor powielający znak. W sam raz do kreski ułamkowej:
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
#include <cstddef>
int main()
{
using namespace std;
double a_troj;
ostringstream os_str;
cin >> a_troj;
os_str << ' ' << a_troj << " * sqrt(3) ";
size_t len = os_str.tellp();
cout << " " << os_str.str() << '\n'
<< " h = " << string(len, '-') << '\n'
<< " " << setw(len / 2 + 1) << "2\n";
}
BTW: Do bardziej zaawansowanych formatowań, warto użyć czegoś zręczniejszego. Np. Boost Format.