【问题标题】:C++ Enum values from string input来自字符串输入的 C++ 枚举值
【发布时间】:2014-04-20 03:41:07
【问题描述】:

已经有一段时间了,希望能得到一些帮助。

我将根据字符串输入使用枚举值 RankSuit 创建和对象 Card。对于 TWO CLUBS 和 ACE DIAMONDS,该字符串将分别采用 '2C, AD' 等格式。

我尝试使用我在 StackOverflow 其他地方找到的线性搜索函数,它在其中,但它只返回 -1,因为它似乎没有获得正确的输入类型。

我已经能够使用 char * 数组转换另一种方式,但我不能以相反的方式做相反的事情。实现见下文:

卡.h

#ifndef _card_h
#define _card_h

#include <string>
#include <iostream>

using namespace std;


enum Rank{  TWO, THREE, FOUR, FIVE, SIX, SEVEN,
            EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE};


enum Suit{  CLUBS, DIAMONDS, HEARTS, SPADES};

//Character sets used to convert enums to strings
static const char * RankStrings[] = { "2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A",};
static const char * SuitStrings[] = { "C", "D", "H", "S" };

class Card {

public:

    ///Constructors and destructors
    Card();
    ~Card();

    ///Accessors
    Rank getRank();
    Suit getSuit();
    string getSuitString();
    string toString(); ///No longer used, but left for testing
    int linearSearch(const char**, const char*, int);

    ///Mutators
    Card(Rank rank, Suit suit);
    Card(string cardStr);


    ///Operators
    bool operator()(Card*, Card*);
    friend ostream& operator<<(ostream&, Card&);

private:
    Suit suit;
    Rank rank;
};

#endif // _random_h

卡片.cpp

#include "card.h"
#include <string>
#include <stdlib.h>
#include <cstring>
#include <iostream>
#include <sstream>
using namespace std;

/**CONSTRUCTORS*/
///Noarg constructor that sets default card values
Card::Card(){
    suit = CLUBS;
    rank = TWO;
}

Card::~Card(){} //Destructor

/**ACCESSORS*/
Rank Card::getRank(void){
    return rank;
}

Suit Card::getSuit(void){
    return suit;
}

string Card::getSuitString(){
    return SuitStrings[suit];
}

/**From tutorial, was used during testing but has been reimplemented
 * as an overloaded operator<< below
 */
string Card::toString(){

    string cardValues;

    cardValues += RankStrings[rank];
    cardValues += SuitStrings[suit];

    return cardValues;
}

/**MUTATORS*/
///Create a new card with given Rank and Suit
Card::Card(Rank cardRank, Suit cardSuit){
    rank = cardRank;
    suit = cardSuit;
}

int Card::linearSearch (const char **Array, const char *searchKey, int arraySize) {
    for (int i = 0; i < arraySize; ++i) {
        if (strcmp(Array[i], searchKey) == 0)
            return i;
    }

    // We didn't find the searchKey in the Array
    return -1;
}

///Sets card rank and suit based on string input
Card::Card(string cardStr){
    stringstream ss;
    string rankStr;

    char *c = &cardStr.at(0);
    cout << *c << endl; //This prints correct value but doesnt work in method below

    int index = linearSearch(RankStrings, c, 13);
    cout << index << endl;


}



/**OPERATORS*/
///Functor to compare two cards for their value
bool Card::operator()(Card* card1, Card* card2){
    return card1->getRank() > card2->getRank();
}

///Puts a string representation of input card on the output stream
ostream& operator<<(ostream& out, Card& card){
    out << RankStrings[card.rank] << SuitStrings[card.suit];
    return out;
}

【问题讨论】:

    标签: c++ arrays string enums char


    【解决方案1】:

    问题是您正在获取“2C”中“2”的地址,然后将其用作完整的 C 字符串。然后,当您在 linearSearch 中使用 strcmp 时,它会尝试匹配整个字符串(“2C”)并失败。

    解决此问题的一种方法是将SuitStringsRankStrings 更改为char 而不是char *,但这也需要更改其他方法。

    另一种方法是将您正在使用的字符复制到一个单独的字符串中,以便 strcmp 可以工作。这样的事情应该这样做:

    char rankStr[2];
    rankStr[0] = cardStr[0];
    rankStr[1] = '\0'; // NULL terminated.
    
    int index = linearSearch(RankStrings, rankStr, 13);
    

    另一种方法是将线性搜索更改为只查看两个字符串的第一个字符。

    【讨论】:

    • 非常感谢你做到了!只要它允许我就会标记为答案:)
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2019-07-04
    相关资源
    最近更新 更多