Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

setw задаёт разную ширину поля вывода строк

#cpp #строки #потоки_данных


Привет!
Есть таблица некоторых строковых переменных (string). Необходимо эту таблицу вывести
в адекватном форматированном виде. Проблема заключается в том, что при использовании
манипулятора setw () строки, разные по длине, занимают разную ширину поля, а не фиксированную.

#include 
#include 
#include 

using namespace std;

int main ()
{
  string one = "Один", two = "Два", eight = "Восемь";
  cout << setw (10) << one <


Ответы

Ответ 1



Эх. Судя по всему, это проблемы интернационализации и utf-8. Дело в том, что C++ не знает об utf-8, и считает ширину поля в байтах, а не в реальных символах. А для utf-8 количество байт не равно количеству символов. Обратите внимание, что у вас ширина поля получилась не 10, а меньше — текст "Один" в utf-8 занимает больше четырёх байт, поэтому количество недостающих до 10 байт меньше. Попробуйте перейти на широкие строки: wstring one = L"Один", two = L"Два", eight = L"Восемь"; wcout << setw (10) << one << endl; wcout << setw (10) << two << endl; wcout << setw (10) << eight << endl; Если вы работаете под Windows, вам придётся прибегнуть к небольшой акробатике, чтобы заставить консоль правильно понимать широкие строки. Под линуксом, кажется, достаточно в начале программы применить заклинание setlocale(LC_ALL, ""); Заметьте, что консольный ввод/вывод приложения должен быть либо полностью «узкий», либо полностью «широкий»: переключиться после первого выведенного символа уже нельзя.

Комментариев нет:

Отправить комментарий