Если ваша настоящая проблема заключается в том, что вы хотите отображать имена с определенной шириной, не изменяйте базовые данные. Вместо этого используйте возможности форматирования ostream
для настройки выравнивания и ширины заливки. Базовые данные следует , а не , чтобы их можно было отображать. Функция отображения должна иметь возможность принимать базовые данные и форматировать их по мере необходимости.
Это взято из https://en.cppreference.com/w/cpp/io/manip/left, которое конкретно описывает функцию std::left
, но показывает примеры std::setw
и std::fill
, что должно дать вам то, что вы хотите. Вам нужно будет #include <iomanip>
, чтобы использовать эти функции.
#include <iostream>
#include <iomanip>
int main(int argc, char** argv)
{
const char name1[] = "Yogesh";
const char name2[] = "John";
std::cout << "|" << std::setfill(' ') << std::setw(10) << std::left << name1 << "|\n";
std::cout << "|" << std::setfill('*') << std::setw(10) << std::right << name2 << "|\n";
}
Выходы
|Yogesh |
|******John|
Замечание о постоянстве std :: cout и ostreams
Обратите внимание, что std::cout
является объектом std::ostream
и по умолчанию действует в течение всего времени жизни вашей программы (или для достаточного количества вашей программы, что оно достаточно близко к времени жизни). Как объект, он имеет переменные-члены. Когда мы вызываем std::setfill('*')
, мы устанавливаем одну из этих переменных-членов (символ заполнения) и перезаписываем символ заполнения по умолчанию. Когда мы вызываем std::setw(10)
, мы устанавливаем базовую ширину потока, пока другая функция не очистит его.
std::setfill
, std::left
, std::right
будут сохраняться до тех пор, пока вы явно не установите их в другое значение ( они не возвращаются к значениям по умолчанию автоматически). std::setw
будет сохраняться до тех пор, пока один из (от https://en.cppreference.com/w/cpp/io/manip/setw)
operator<<(basic_ostream&, char) and operator<<(basic_ostream&, char*)
operator<<(basic_ostream&, basic_string&)
std::put_money (inside money_put::put())
std::quoted (when used with an output stream)
Таким образом, std::setw
будет сохраняться до следующего std::string
или const char *
вывода.