Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用strcat的堆损坏 我的缺点之一是在C++中有效地使用字符,这正是我现在正在尝试做的。我在游戏中有一个player类,在player类中,我创建了一个playerCard对象,它显示各种信息。这对于玩家对象的单个实例很好,即玩家,但当我试图将玩家对象推回向量时,一切都会出错_C++ - Fatal编程技术网

使用strcat的堆损坏 我的缺点之一是在C++中有效地使用字符,这正是我现在正在尝试做的。我在游戏中有一个player类,在player类中,我创建了一个playerCard对象,它显示各种信息。这对于玩家对象的单个实例很好,即玩家,但当我试图将玩家对象推回向量时,一切都会出错

使用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

基本上,程序会继续运行,但播放器不会渲染到屏幕上。当我退出程序时,当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类,它是混乱的,可能是处理事情的错误方式,但我正试图用字符/字符串等来让我的头脑清醒过来 包括标题.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中取消引用它之前,它已被删除。您需要确保它已正确初始化。非常感谢!工作:是的,我非常清楚这需要一些工作,我现在就开始!谢谢你的帮助非常感谢!工作:是的,我非常清楚这需要一些工作,我现在就开始!谢谢你的帮助