#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();
Таким образом, массив будет помещен в строку и будет считаться одним блоком, что я и искал.