写信给单词

时间:2012-03-06 10:06:04

标签: c++

我将把我的课程展示给我需要使用的其他东西。如果我进行类型转换会有用吗?或者我只需要学习字符串?

class NumberBox
{
private:

    int number;
    char letter;

public:

    NumberBox *next_ptr;
    void setNumber(int number)
    {
        this->number = number;
    }

    void setLetter(char letter)
    {
        this->letter = letter;
    }


    int getNumber()
    {
        return number;
    }

    int getLetter()
    {
        return letter;
    }
};

int main()

    cout << "Please Give the faction for the first Card" << endl;
    cin >> faction[0];
    if(faction [0] == 's' || faction [0] == 'c' || faction [0] == 'h' || faction [0] == 'd')
    {
        if(faction[0] == 's')
        {
            faction[0] = "spade";
            factionHead_ptr->setLetter("spade");
        }
    }

你是怎么做到的?如果用户输入's'那么它将是Spade。

4 个答案:

答案 0 :(得分:3)

您可以使用std::map来实现此目的。您可以构建从charstd::string的地图,其中一个值设置为schd

如何使用它的一个小例子是:

#include <iostream>
#include <map>

typedef std::map<char, std::string> suitmap;

int main()
{
    suitmap suits;
    suits['s'] = "spades";
    suits['h'] = "hearts";
    char in;
    std::cout << "Suit?" << std::endl;
    if (std::cin >> in) {
        suitmap::const_iterator it = suits.find(in);
        if (it != suits.end())
            std::cout << it->second << std::endl;
        else
            std::cout << "not found" << std::endl;
    } else {
        std::cout << "no input" << std::endl;
    }
    return 0;
}

根据您的问题,假设faction是一个char的数组:

cin >> faction[0];
// see if we have a match for faction[0] in the map
suitmap::const_iterator it = suits.find(faction[0]);
if (it == suits.end()) {
   // no match
   // print an error or something
} else {
   // match! the string is in it->second
   std::string suit = it->second;
   factionHead_ptr->setLetter(suit);
}

现在这对于NumberBox类来说根本不起作用,因为setLetter函数需要一个char,而letter成员也是char。因此,您需要将这两个更改为/ std::string s。

如果你想要的只是一个字母,那么你的letter会员就可以了,但是你不能把整个字符串放在一个字母中,所以你setLetter的{​​{1}}来电main没有多大意义。因此,如果您只需要一个字母,而不是从单个字母到完整西装名称的映射,只需使用switch语句:

cin >> faction[0];
switch (faction[0]) {
  case 's': case 'c': case 'h': case 'd':
    factionHead_ptr->setLetter(faction[0]);
    break;
  default:
    // invalid input given, do something about it
    break;
}

答案 1 :(得分:1)

此行不起作用:

if(faction [0] == 's' && 'c' && 'h' && 'd')

因为if语句的一部分是自己评估的。例如:'c'将始终评估为true,因此该语句无效。它应该是这样的:

if(faction [0] == 's' || faction [0] == 'c' || faction [0] == 'h' || faction [0] == 'd')

您可以在此处完美地使用switch声明:

switch(faction[0]) {
case 's':
    factionHead_ptr->setLetter("spade");
    break;
case 'c':
    ...
    break;
...

default:
    // code here if none of s, c, h, d
    break;
}

编辑:还要注意您的数据类型。 E.g我不确定faction[0] = "spade";是否会按预期运作,因为faction[0]似乎是char类型而不是字符串。

答案 2 :(得分:1)

你不能像你那样连锁条件。条件是,如果faction的第一个字母是s `派系的第一个字母是c ......

像这样:

if(faction [0] == 's' || faction [0] == 'c' || faction [0] == 'h' || faction [0] == 'd')

您可以使用switch声明:

string faction;
char type;

cin >> type;

switch (type)
{
case 's':
    faction = "spade";
    break;
case 'c':
    faction = "clib";
    break;
case 'h':
    faction = "heart";
    break;
case 'd':
    faction = "diamond";
    break;
default:
    cout << "Illegal card type\n";
    break;
}

上面的代码还解决了您遇到的另一个问题,即使用faction[0]作为字符串和字符。由于您未指定faction的类型,因此我在上面的示例中将其设为字符串。

答案 3 :(得分:1)

switch(functin[0]) {
  case 's': faction = "spade";factionHead_ptr->setLetter("spade");break;
  case 'c': faction = "clubs";factionHead_ptr->setLetter("clubs");break;
  case 'h': faction = "hearts";factionHead_ptr->setLetter("hearts");break;
  case 'd': faction = "diamonds";factionHead_ptr->setLetter("diamonds");break;
  default: cerr<<"wrong suite entered";
}