从几个变量创建字符串

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。您必须选择一个字符来表示该排名。

【讨论】:

以上是关于从几个变量创建字符串的主要内容,如果未能解决你的问题,请参考以下文章

java怎样截取最后几个字符

从几个嵌套字典制作熊猫数据框

我需要连接几个字符串

c ++从几个文件中读取几个数组

如果我从几个可能中知道确切的类型,我应该使用 C++ 啥类型?

如何从几个相同的值中获取一个值?