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++. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x