C++中使用std::setw()输出数组内容时如何保证对齐效果?
解决方案
你对std::setw的特性判断是准确的,std::setw仅对紧随其后的第一个输出项生效,因此只要将手牌序列先拼接为完整的单个字符串,再传入输出流就能保证对齐效果。你之前拼接字符串未达预期,通常是未处理好元素间的空格分隔格式,可通过std::ostringstream实现拼接:
步骤1:引入必要头文件并实现拼接工具函数
#include <sstream> #include <string> #include <vector> // 输入手牌vector,返回空格分隔的手牌字符串 std::string join_cards(const std::vector<int>& cards) { std::ostringstream oss; for (size_t i = 0; i < cards.size(); ++i) { if (i != 0) oss << " "; oss << cards[i]; } return oss.str(); }
步骤2:修改输出逻辑
int width = 18; // 提前拼接好双方手牌字符串 std::string player_cards = join_cards(player.cards); // 替换为你自己的玩家手牌vector变量名 std::string dealer_cards = join_cards(dealer.cards); // 替换为你自己的庄家手牌vector变量名 // 手牌行输出 std::cout << std::left << std::setw(width) << "Your cards:"; std::cout << std::left << std::setw(width * 2) << player_cards; std::cout << std::left << std::setw(width) << "Dealers cards:"; std::cout << dealer_cards << std::endl; // 点数行输出,原有逻辑无需修改 std::cout << std::left << std::setw(width) << "Your sum:"; std::cout << std::left << std::setw(width*2) << player.sum(); std::cout << std::left << std::setw(width) << "Dealers sum:"; std::cout << dealer.sum() << std::endl; // 资金行输出 std::cout << std::left << std::setw(width) << "Your capital:"; std::cout << std::left << std::setw(width*2) << player.capital; std::cout << std::left << std::setw(width) << "Dealers capital:"; std::cout << dealer.capital << std::endl;
注意事项
你设置的width*2 = 36的宽度已经足够覆盖黑杰克游戏最大可能的手牌长度(最多10张手牌总长度不超过20字符),不会出现截断导致对齐失效的问题。
内容的提问来源于stack exchange,提问作者Zipur
相关产品推荐
相关产品推荐

