Как вы можете использовать std::setw() с выводом массива?

#c #vector #console #cout

Вопрос:

Я создаю игру в блэкджек на C и пытаюсь распечатать карты игроков и дилеров в дополнение к их суммам, капиталу и так далее. Однако я сталкиваюсь с проблемой std::setw() при распечатке вектора карточек. Вот фрагмент кода:

 int width = 18;  std::cout lt;lt; std::left lt;lt; std::setw(width) lt;lt; "Your cards:";  std::cout lt;lt; std::left lt;lt; std::setw(width * 2) lt;lt; "arr";  std::cout lt;lt; std::left lt;lt; std::setw(width) lt;lt; "Dealers cards:";  std::cout lt;lt; "arr2" lt;lt; std::endl;   std::cout lt;lt; std::left lt;lt; std::setw(width) lt;lt; "Your sum:";  std::cout lt;lt; std::left lt;lt; std::setw(width*2) lt;lt; player.sum();  std::cout lt;lt; std::left lt;lt; std::setw(width) lt;lt; "Dealers sum:";  std::cout lt;lt; dealer.sum() lt;lt; std::endl;  

Как выглядит мой фрагмент кода

Где arr и arr2 есть , должны быть числовые значения, например 5 2 6 1 , но если я напечатаю каждый элемент отдельно, выравнивание будет нарушено. Я думаю, что для setw() работы это должен быть один блок или строка, иначе вертикальное выравнивание испортится, как только значения изменятся. Я попробовал myString.push_back() для каждого векторного значения, а затем напечатал его, но безуспешно. Я предполагаю, что мне нужно найти способ распечатать строку в один элемент.

Вот как это должно выглядеть:

 Your cards: 5 7 1 2 Dealers cards: 2 1 7 5 Your sum: 21 Dealers sum: 21 Your capital: 100 Dealers capital: 100  

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

1. Имеет ли значение, если пространство между обоими столбцами в точности равно количеству пробелов? Вы можете применить только std::setw при печати последнего числа в массиве.

2. Это не имеет значения, однако тогда возникает вопрос, каким должно быть число ширины — имейте в виду, что массив может состоять из 2-6 или более чисел. Важно, чтобы колонны были прямыми.

Ответ №1:

Я нашел решение. Вы можете использовать stringstream для добавления значений int в строку без ошибок при преобразовании, вот как я исправил свой код:

 #include lt;sstreamgt; std::stringstream playerCards{};  for (int i{}; i lt; player.cards.size(); i  ) {  playerCards lt;lt; player.cards[i] lt;lt; " "; }  int width = 18; std::cout lt;lt; std::left lt;lt; std::setw(width) lt;lt; "Your cards:"; std::cout lt;lt; std::left lt;lt; std::setw(width * 2) lt;lt; playerCards.str();  

Таким образом, массив будет помещен в строку и будет считаться одним блоком, что я и искал.