我将把我的课程展示给我需要使用的其他东西。如果我进行类型转换会有用吗?或者我只需要学习字符串?
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。
答案 0 :(得分:3)
您可以使用std::map
来实现此目的。您可以构建从char
到std::string
的地图,其中一个值设置为s
,c
,h
和d
。
如何使用它的一个小例子是:
#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";
}