我打算用cstring完成程序 现在我需要从用户那里获得PokemonWorld的名字 并初始化
但我无法将main()中的cstring转换为类PokemonWorld
我尝试了cin >> world.setName
和cin >> name; world.setName(name)
两者都失败了
class PokemonWorld {
private:
char name[10];
public:
void setName(char x[]) {
*name = x;
};
char* getName(){
return name;
};
};
void main() {
PokemonWorld world;
int number;
char name[10];
cout << "What is the World Name ?" ;
cin >> name;
world.setName(name);
此外,我无法使用getName返回分配给PokemonWorld的名称
以下是错误代码:
错误C3867'PokemonWorld :: getName':非标准语法;使用'&amp;'创建指向成员的指针
我应该将PokemonWorld创建为指针吗?
答案 0 :(得分:0)
您需要先设置名称。在您的主要方法中,
PokemonWorld world;
int number;
char name[10];
cout << "What is the World Name ?" ;
cin >> name;
world.setName(name);
//Then get the name
world.getName(name);
答案 1 :(得分:0)
使用cstring
,您必须使用c字符串操纵器。你肯定不能将数组分配给另一个。对于您的问题,请使用strncpy_s
:
void setName(char x[]) {
strncpy_s(name, 10, x, 10);
};
另外,为了避免问题,你的getter应该是:
const char * const getName() const {
return name;
};
另外,要进行比较,请使用strncmp
来连接使用strncat
,...
或者,因为您使用c ++,请使用std::string
答案 2 :(得分:0)
您没有使用cstring(大多数听到“cstring”的人都会想到MFC库的CString
类。)
您正在使用“C”字符串或原始字符指针。这通常是不好的做法,因为它涉及手动执行内存管理,除非您解决使用原始指针所带来的问题,否则您的代码中只会出现这些问题。
setName应为:
void setName(char const * const x)
{
auto length = std::min(std::strlen(x), 9); // only copy up to 9 characters
std::copy_n(x, length, name);
name[length] = '\0';
}
...或(已经是pointed out):
strncpy_s(name, 10, x, 10);
getName应为:
char const * const getName() const
{
return name;
}
这段代码几乎是正确的:
char name[10];
cout << "What is the World Name ?" ;
cin >> name;
world.setName(name);
...但您应该在声明它的地方初始化名称:
char name[10] = { 0 };
另外,如果用户输入超过10个字符,您会怎么做?在这种情况下,程序的堆栈将被破坏。
您可以使用std :: string来避免此问题。