Различное форматирование печати между тестовыми примерами

#c #printing #format

#c #печать #формат

Вопрос:

Итак, у меня есть два приведенных ниже тестовых примера, один из которых показывает правильность, а другой неверен. Мне нужно сопоставить мой неправильный вариант с правильным. Функция печати, которая реализована следующим образом. Я считаю, что логика немного неправильная. Но я не знаю, что делать дальше. Мне потребовалась бы ваша помощь в этом. Спасибо.

Правильная печать:

 ********** TestSubscript1 **********
Construct from unsigned char array:
2  4  6  6  8  10  6  12  234  14  16  6  6  (size=13, capacity=16)
using subscript: a[6]
a[6] = 6
  

Неправильная печать:

 ********** TestSubscript1 **********
Construct from unsigned char array:
2  4  6  6  8  10 6  12 23414 16 6  6  (size=13, capacity=16)
using subscript: a[6]
a[6] = 6
  

Функция печати:

 void Print(const vector<unsigned char>amp; s)
{
    for(int i = 0; i < s.count; i  ) 
    {
        std::cout<<std::setw(3)<<std::left<<(unsigned)s.v[i]; 
    }
std::cout<<std::setw(2)<< "(size=" << s.count << ", " << "capacity=" << 
s.capacity << ")";
std::cout<<std::endl; 
}
  

Ответ №1:

Не задавайте ширину числа, просто поставьте два пробела после числа:

 std::cout << static_cast<unsigned int>(s.v[i]) << "  ";
  

И затем:

 std::cout<< "(size=" << s.count << ", " << "capacity=" << s.capacity << ")";
  

Ответ №2:

«Правильный» вывод не ограничивается использованием только std::setw(3) для всех чисел, как вы делаете в своем выводе. Желаемый результат можно получить, используя std::setw(3) для 1-значных чисел, std::setw(4) для 2-значных чисел и std::setw(5) для 3-значных чисел, а затем опустив std::setw(2) в конце:

 int getw(unsigned char ch)
{
    if (ch < 10) return 1;
    if (ch < 100) return 2;
    return 3;
) 

void Print(const vector<unsigned char>amp; s)
{
    for(int i = 0; i < s.count;   i)
    {
        unsigned char ch = s.v[i];
        std::cout << std::setw(2 getw(ch)) << std::left << (unsigned)ch;
    }
    std::cout << "(size=" << s.count << ", " << "capacity=" << s.capacity << ")";
    std::cout << std::endl;
}
  

Более простой способ добиться одинакового результата — вообще не использовать std::setw и std::left . Просто запишите числа как есть, а затем напишите 2 пробела после каждого числа:

 void Print(const vector<unsigned char>amp; s)
{
    for(int i = 0; i < s.count;   i)
    {
        unsigned char ch = ;
        std::cout << (unsigned)s.v[i] << "  ";
    }
    std::cout << "(size=" << s.count << ", " << "capacity=" << s.capacity << ")";
    std::cout << std::endl;
}