I'm making a sales receipt. The user enters in the name and price of the items. On the display, I want the name of the items to be aligned as well as the price of the items. Is there a way to get the setw for the objects after the name to be determined based on the name length? Since the names of the items will be of different lengths. The specific part of the codde is below.

    cout << "********************************************" << endl;
    cout << "********  S A L E S  R E C E I P T  ********" << endl;
    cout << "********************************************" << endl;
    cout << "**                                        **" << endl;
    cout << "**                                        **" << endl;
    for (i=0; i<items; i++)
    {
        cout << "**    " << name[i] << setw(3) << ": $" << setw(9) << price[i] << "            **" << endl;
    }//end for
    cout << "**                                        **" << endl;
    cout << "**                                        **" << endl;
    cout << "********************************************" << endl;

To do this just keep track of the length of the longest name and use that. For example:

int main () {
    std::vector< std::string > names;
    std::string name;
    size_t long_name = 0;
    while (std::cin >> name) {
        long_name = std::max (long_name, name.size());
        names.push_back (name);
    }
    for (std::vector< std::string >::iterator it = names.begin ();
            it != names.end(); ++it)
        std::cout << "'" << std::setw(long_name) << *it << "'" << std::endl;
    return 0;
}
This article has been dead for over six months. Start a new discussion instead.