C++
Как сделать все строки одинакового размера в C++: setw, пробелы и обрезка
В C++ «сделать все строки одинакового размера» можно понимать двумя способами. Если нужно красиво вывести таблицу в консоль, используйте std::setw. Если нужно изменить сами данные, используйте дополнение пробелами, обрезку или std::string::resize
Сначала решите, что вам нужно:
- выровнять строки только при выводе;
- физически изменить строки в
std::vector<std::string>; - привести строки к фиксированной длине для файла или протокола.
Выровнять строки при выводе
Для консольной таблицы проще всего взять std::setw:
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> names = {"Ann", "Robert", "Li"};
for (const std::string& name : names) {
std::cout << std::left << std::setw(10) << name << "|\n";
}
return 0;
}
Вывод:
Ann |
Robert |
Li |
std::setw(10) задает ширину поля вывода. std::left выравнивает текст по левому краю
Важно: std::setw не меняет саму строку. Он влияет только на следующий вывод
Изменить сами строки
Если нужно, чтобы каждая строка реально стала длиной 10 символов, можно использовать resize:
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> words = {"cat", "elephant", "dog"};
for (std::string& word : words) {
word.resize(10, ' ');
}
for (const std::string& word : words) {
std::cout << "[" << word << "]\n";
}
return 0;
}
Если строка короче 10, она дополнится пробелами. Если длиннее 10, она будет обрезана
Безопасная функция нормализации
Иногда лучше сделать отдельную функцию, чтобы явно контролировать поведение:
#include <string>
std::string fitToWidth(std::string text, std::size_t width) {
if (text.size() > width) {
text.resize(width);
} else {
text.append(width - text.size(), ' ');
}
return text;
}
Использование:
std::cout << "[" << fitToWidth("hello", 10) << "]\n";
std::cout << "[" << fitToWidth("very_long_word", 10) << "]\n";
Такой подход удобен, если одинаковый формат нужен в нескольких местах программы
Найти максимальную длину автоматически
Если заранее неизвестно, какой ширины должны быть строки, можно найти максимальную длину:
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> words = {"cat", "elephant", "dog"};
std::size_t maxLength = 0;
for (const std::string& word : words) {
if (word.size() > maxLength) {
maxLength = word.size();
}
}
for (std::string& word : words) {
word.resize(maxLength, ' ');
}
for (const std::string& word : words) {
std::cout << "[" << word << "]\n";
}
return 0;
}
Теперь все строки будут длиной самого длинного слова
Что с русскими буквами
Если строки в UTF-8 содержат русские буквы, size() и resize() считают байты, а не видимую ширину символов. Для простых учебных задач с латиницей это нормально. Для полноценного выравнивания Unicode-текста нужны специальные библиотеки или отдельная логика подсчета отображаемой ширины
Частые ошибки
Ждать, что setw изменит строку
std::setw меняет только формат вывода:
std::cout << std::setw(10) << name;
Сама переменная name остается прежней
Обрезать данные без предупреждения
resize(10) у длинной строки удалит хвост. Если данные важны, лучше сначала проверить длину и решить, можно ли обрезать
Путать размер строки и ширину на экране
Для английских символов часто совпадает. Для Unicode может отличаться
Короткий вывод
Для красивого вывода строк одинаковой ширины используйте std::setw. Если нужно изменить сами строки, применяйте resize, append или отдельную функцию нормализации. Для русского текста учитывайте, что size() считает байты
Связанные материалы:
Что почитать дальше по C++
Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:
- Enter в C++: перенос строки, std::endl и ввод через cin
- length в C++: длина строки, vector, массива и C-строки
- Как отделить буквы от цифр в C++: isalpha, isdigit и две строки
- Как очистить переменную string в C++: clear, присваивание пустой строки и erase