我的一个弱点是在C ++中有效地使用chars,这正是我现在要做的。我在游戏中有一个玩家类,在玩家类中,我创建了一个显示各种信息的playerCard对象。这适用于播放器对象的单个实例(即播放器播放器),但是当我尝试将播放器对象推送到向量时,一切都会出错。
基本上,程序继续运行,但播放器不会渲染到屏幕上。当我退出程序时,当main尝试返回MSG时,我得到一个断点错误。关于断点的评论如下:
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
我已将错误定位到此处
strcat(nameCard, nameChar);
strcat(nameCard, genderChar);
strcat(nameCard, ageChar);
strcat(nameCard, cashHeldChar);
strcat(nameCard, productWantedChar);
在playerCard类中,因为当我评论这个时,我没有得到错误。这是完整的playerCard类(再次,它是凌乱的,可能是错误的方式去做事情,但我想尝试使用字符/字符串等) #include“Headers.h”;
class Playercard{
private:
RECT textbox;
LPD3DXFONT font;
std::string nameStr;
std::string genderStr;
std::string ageStr;
std::string cashHeldStr;
std::string prodWantedStr;
char nameCard[1000];
public:
Playercard()
{
}
void load(char* name, bool male, int age, double cash, char* prod)
{
if(male)
{
genderStr = "Gender: Male\n";
}
else
{
genderStr = "Gender: Female\n";
}
nameStr = "Name: " + static_cast<std::ostringstream*>( &(std::ostringstream() << name))->str() + "\n";
ageStr = "Age: " + static_cast<std::ostringstream*>( &(std::ostringstream() << age))->str() + "\n";
cashHeldStr = "Cash Held: " + static_cast<std::ostringstream*>( &(std::ostringstream() << cash))->str() + "\n";
prodWantedStr = "Product Wanted: " + static_cast<std::ostringstream*>( &(std::ostringstream() << prod))->str() + "\n";
char * nameChar = new char [nameStr.length()+1];
char * genderChar = new char [genderStr.length()+1];
char * ageChar = new char [ageStr.length()+1];
char * cashHeldChar = new char [cashHeldStr.length()+1];
char * productWantedChar = new char [prodWantedStr.length()+1];
strcpy(nameChar, nameStr.c_str());
strcpy(genderChar, genderStr.c_str());
strcpy(ageChar, ageStr.c_str());
strcpy(cashHeldChar, cashHeldStr.c_str());
strcpy(productWantedChar, prodWantedStr.c_str());
strcat(nameCard, nameChar);
strcat(nameCard, genderChar);
strcat(nameCard, ageChar);
strcat(nameCard, cashHeldChar);
strcat(nameCard, productWantedChar);
diagFile.open("Diag.txt");
diagFile.write("Test", 100);
diagFile.close();
}
void setUp(int L, int T, int R, int B)
{
SetRect(&textbox, L,T,R,B);
}
void draw()
{
font->DrawTextA(d3dSprite, nameCard, -1, &textbox, DT_LEFT, D3DCOLOR_XRGB(255, 255, 255));
}
LPCSTR plCard()
{
return nameCard;
}
};
非常感谢任何帮助。谢谢。
答案 0 :(得分:2)
您的nameCard
未初始化。将第一个strcat
替换为strcpy
,或使用零字符串对其进行初始化。
现在,如何独家使用std::string
?
答案 1 :(得分:2)
您的主要问题是nameCard
未初始化。 strcat
需要以空字符结尾的字符串来完成其魔法,并且无法保证nameCard
中的第一个或任何字符为空。
但是,C字符串是不必要的。只需始终使用std::string
即可。将nameCard
更改为字符串后,我将load
更改为(文件写入已排除):
void load(const std::string &name, bool male, int age, double cash, const std::string &prod)
{
nameStr = "Name: " + name + "\n";
genderStr = "Gender: " + (male ? "Male" : "Female") + "\n";
ageStr = "Age: " + std::to_string(age) + "\n";
cashHeldStr = "Cash Held: " + std::to_string(cash) + "\n";
prodWantedStr = "Product Wanted: " + prod + "\n";
nameCard = nameStr + genderStr + ageStr + cashHeldStr + prodWantedStr;
}
我实际上只是让nameCard
成为数据成员,删除其他成员,并使用它:
nameCard.clear();
nameCard += "Name: " + name + "\n";
//add on other parts
除此之外,让plCard()
返回std::string
,然后在draw()
中使用nameCard.c_str()
。我希望能更清楚你能用字符串做些什么。
但请注意,std::to_string
是C ++ 11。 C ++ 03有两个常见的解决方案:
std::string str = boost::lexical_cast<std::string>(someNumber);
或者
std::ostringstream oss;
oss << someNumber;
std::string str = oss.str();
我发现三衬里比单衬里或双衬里更具可读性。