使用strcat的堆损坏 我的缺点之一是在C++中有效地使用字符,这正是我现在正在尝试做的。我在游戏中有一个player类,在player类中,我创建了一个playerCard对象,它显示各种信息。这对于玩家对象的单个实例很好,即玩家,但当我试图将玩家对象推回向量时,一切都会出错
基本上,程序会继续运行,但播放器不会渲染到屏幕上。当我退出程序时,当main试图返回MSG时,我会得到一个断点错误。关于断点的注释如下:使用strcat的堆损坏 我的缺点之一是在C++中有效地使用字符,这正是我现在正在尝试做的。我在游戏中有一个player类,在player类中,我创建了一个playerCard对象,它显示各种信息。这对于玩家对象的单个实例很好,即玩家,但当我试图将玩家对象推回向量时,一切都会出错,c++,C++,基本上,程序会继续运行,但播放器不会渲染到屏幕上。当我退出程序时,当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 f
/*
* 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类,它是混乱的,可能是处理事情的错误方式,但我正试图用字符/字符串等来让我的头脑清醒过来
包括标题.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;
}
};
任何帮助都将不胜感激。谢谢。您的名片未初始化。用strcpy替换第一个strcat,或用零字符串初始化它
现在,以独占方式使用std::string如何?您的名片未初始化。用strcpy替换第一个strcat,或用零字符串初始化它
现在,以独占方式使用std::string如何?您的主要问题是名片未初始化。strcat需要一个以null结尾的字符串来发挥作用,并且不能保证名片中的第一个或任何字符是null
但是,C字符串是不必要的。只要一直使用std::string。将名片更改为字符串后,我会将load更改为file writing excluded:
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_字符串是C++11。C++03有两种常见的解决方案:
std::string str = boost::lexical_cast<std::string>(someNumber);
或
我发现三行程序比一行或两行程序可读性好得多。您的主要问题是名片未初始化。strcat需要一个以null结尾的字符串来发挥作用,并且不能保证名片中的第一个或任何字符是null
但是,C字符串是不必要的。只要一直使用std::string。将名片更改为字符串后,我会将load更改为file writing excluded:
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_字符串是C++11。C++03有两种常见的解决方案:
std::string str = boost::lexical_cast<std::string>(someNumber);
或
<>我发现三个内衬比一个线性或两个线性衬里读得多。< /P>你为什么使用字符数组和指针而不是连接C++字符串,然后使用CySTR?另外,只需使用nameStr=std::stringName:+name+\n;,或者更好的是,使用字符串作为参数。谢谢,我将改为使用此参数。正如我提到的。。。不擅长使用字符串:/n您不需要所有这些ostringstreams。例如,要构建nameStr,可以执行nameStr=Name:;nameStr+=名称;或nameSTr=std::stringName:+name;。或者你根本做不到,只能在你需要的时候生成这些东西。与通常的情况相比,这是一个很好的问题。标题描述了这个问题,问题被正确地缩小到了一个非常有限的范围,我们需要看到的所有代码都被提供了,而且没有更多,而且,尽管这可能不是第一件值得注意的事情,但在给出他们真正想要的答案时,OP并不是不必要的顽固。哦,我只是注意到,就提供的代码而言,在draw中取消对字体的引用之前,字体是未初始化的。你会想确保它被正确初始化。你使用字符数组和指针而不是连接C++字符串然后使用CySTR的原因是什么?另外,只需使用nameStr=std::stringName:+name+\n;,或者更好的是,使用字符串作为参数。谢谢,我将改为使用此参数。正如我提到的。。。不擅长使用字符串:/n您不需要所有这些ostringstreams。例如,要构建nameStr,可以执行nameStr=Name:;nameStr+=名称;或nameSTr=std::stringName:+name;。或者你根本做不到,只能在你需要的时候生成这些东西。与通常的情况相比,这是一个很好的问题。标题描述了这个问题,问题被正确地缩小到了一个非常有限的范围,我们需要看到的所有代码都被提供了,而且没有更多,而且,尽管这可能不是第一件值得注意的事情,但在给出他们真正想要的答案时,OP并不是不必要的顽固。哦,我只是注意到,就所提供的代码而言,字体是未初始化的
在draw中取消引用它之前,它已被删除。您需要确保它已正确初始化。非常感谢!工作:是的,我非常清楚这需要一些工作,我现在就开始!谢谢你的帮助非常感谢!工作:是的,我非常清楚这需要一些工作,我现在就开始!谢谢你的帮助