从几个变量创建字符串
Posted
技术标签:
【中文标题】从几个变量创建字符串【英文标题】:Creating string from few variables 【发布时间】:2017-12-14 12:13:30 【问题描述】:我需要根据其他几个变量创建文件路径,它是字符串。
Deck::Deck()
char ranks[13] = '2', '3', '4', '5', '6', '7', '8', '9', '10',
'J', 'Q', 'K', 'A';
char suits[4] = 'c', 'd', 'h', 's' ;
for (int rank_index = 0; rank_index < 13; rank_index++)
for (int suit_index = 0; suit_index < 4; suit_index++)
std::string l_file_name = std::to_string(ranks[rank_index]) +
std::to_string(suits[suit_index]) + ".png";
int l_value = rank_index + 2;
if (ranks[rank_index] == 'J') l_value = 2;
if (ranks[rank_index] == 'Q') l_value = 3;
if (ranks[rank_index] == 'K') l_value = 4;
if (ranks[rank_index] == 'A') l_value = 11;
m_deck.push_back(Card(
ranks[rank_index], suits[suit_index], l_value, l_file_name));
卡片构造函数如下所示
Card::Card(char p_rank, char p_suit, int p_value, std::string p_texture_file_name)
:m_rank(p_rank), m_suit(p_suit), m_value(p_value)
m_texture.loadFromFile(FILE_PATH + p_texture_file_name);
m_shape.setSize((sf::Vector2f(70, 90)));
m_shape.setTexture(&m_texture);
而 m_deck 只是
std::vector<Card> m_deck;
我想实现这样的字符串,例如 Qc.png(俱乐部女王)等,尽管我的字符串中有一些数字
5099.png 无法加载图像“res\cards\5099.png”。原因:无法打开文件
例如。它不会将我的字符转换为字符串,而是转换为一些数字。
【问题讨论】:
“它不会将我的字符转换成字符串,而是转换成一些数字。” 当然可以。将数字转换为字符串是std::to_string()
的用途,因此它将输入 char
视为整数,而不是字符。你读过它的文档吗?要附加chars
,首先创建一个字符串,然后使用+=
、.push_back()
、.append(N, c)
、+
等。同样,文档将显示所有不同的可能性。
How to append a char to a std::string?的可能重复
【参考方案1】:
您的问题是std::to_string(ranks[rank_index])
。 std::to_string
将数字转换为字符串。 char
可以被认为是一个字符,但它也可以被认为是一个至少可以容纳 0-127 的小数。
因此,在典型的 ASCII 实现中,std::to_string('2')
将返回一个包含 "50"
的字符串。
您需要的是构造一个包含简单字符的字符串。你可以这样做:std::string1, ranks[rank_index]
(或者你可以使用括号 (()
),但是使用花括号可以更清楚地表明你正在初始化一个临时对象)。
顺便说一句,我会使用 emplace_back,而不是 push_back:
m_deck.emplace_back(
ranks[rank_index], suits[suit_index], l_value, l_file_name);
它节省了不必要的副本。
【讨论】:
【参考方案2】:std::to_string 方法将数值类型转换为其对应的字符串,因此您得到的数字是对应字符的 ASCII 码。实现您的意图的一种非常直接的方法是使用字符串流来填充字符串:
// String stream definitions
#include<sstream>
for (int rank_index = 0; rank_index < 13; rank_index++)
for (int suit_index = 0; suit_index < 4; suit_index++)
std::string l_file_name;
std::stringstream s_l_file_name;
s_l_file_name << ranks[rank_index] << suits[suit_index] << ".png";
s_l_file_name >> l_file_name;
// Remainder of the code
另外,'10' 是一个多字符常量,它会触发警告并导致意外行为,请参阅this answer about multi-char constansts。您必须选择一个字符来表示该排名。
【讨论】:
以上是关于从几个变量创建字符串的主要内容,如果未能解决你的问题,请参考以下文章