从少数变量创建字符串

时间:2017-12-14 12:13:31

标签: c++ string type-conversion

我需要基于少数其他变量创建文件路径,即字符串。

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无法加载图片&#34; res \ cards \ 5099.png&#34;。原因:无法打开文件

例如。它不会将我的字符转换为字符串,而是转换为某些数字。

2 个答案:

答案 0 :(得分:3)

您的问题是std::to_string(ranks[rank_index])std::to_string 将数字转换为字符串。 char可以被认为是一个角色,但它也可以被认为是一个可以容纳至少0-127的小数字。

因此,在典型的ASCII实现中,std::to_string('2')将返回包含"50"的字符串。

您需要的是构造一个包含简单字符的字符串。您可以使用:std::string{1, ranks[rank_index]}(或者您可以使用parens(())来执行此操作,但使用花括号可以更清楚地初始化临时内容。)

顺便说一下,我不是使用push_back,而是使用emplace_back:

                m_deck.emplace_back(
                       ranks[rank_index], suits[suit_index], l_value, l_file_name);

它保存了不必要的副本。

答案 1 :(得分:0)

std :: to_string方法将数字类型转换为其对应的字符串,因此您获得的数字是相应字符的ASCII代码。实现您的意图的一种非常直接的方法是使用字符串流来填充字符串:

{{1}}

此外,&#39; 10&#39;是一个多字符常量,它会触发警告并导致意外行为,请参阅this answer about multi-char constansts。您必须选择一个字符来表示该排名。