首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符*数组结构的C++字符串

字符*数组结构的C++字符串
EN

Stack Overflow用户
提问于 2013-07-16 16:38:48
回答 3查看 877关注 0票数 1

在这个特定的问题上,我一直在绞尽脑汁,我想要一些建议。我有以下结构:

代码语言:javascript
运行
复制
struct MqlStr // MQL String Array
{
int               len;
char              *string;
};

这将作为指针从外部应用程序传递给函数,如下所示:

代码语言:javascript
运行
复制
MT4_EXPFUNC double __stdcall CheckExecutionRequests(MqlStr* RequestInfo)

在该函数中,我生成了许多字符串值,需要将这些字符串值分配给MqlStr数组的各个元素。下面的代码运行良好:

代码语言:javascript
运行
复制
RequestInfo[1].string = "1";
RequestInfo[2].string = "2";

但是,当我使用strcpy将生成的字符串值放入数组时,它会用复制的值覆盖整个数组。例如:

代码语言:javascript
运行
复制
string field1 = value.substr(Demark + 1, Demark2 - Demark - 1);
strncpy(RequestInfo[1].string, field1.c_str(), field1.size());

string field2 = value.substr(Demark + 1, Demark2 - Demark - 1);
strncpy(RequestInfo[2].string, field2.c_str(), field2.size());

如果field1 =1且field2 =2,则整个RequestInfo[]数组将等于2(复制的最后一个值)

谁能给我指个方向?

EN

回答 3

Stack Overflow用户

发布于 2013-07-16 16:42:32

代码语言:javascript
运行
复制
RequestInfo[1] = "1";

并不是像你想的那样做。要么就是

代码语言:javascript
运行
复制
RequestInfo[1].string = "1";

如果RequestInfo是至少包含2个元素的MqlStr对象的向量,或者

代码语言:javascript
运行
复制
RequestInfo->string = "1";

如果RequestInfo是指向单个MqlStr对象的指针。

票数 0
EN

Stack Overflow用户

发布于 2013-07-16 17:01:45

您是否为RequestInfo元素中的.string指针分配了足够的空间?strncpy没有为您分配空间,请使用strdup来分配空间。

票数 0
EN

Stack Overflow用户

发布于 2013-07-16 17:39:57

您需要以安全的方式管理MqlStr内存,这可以通过使用std::string等标准容器或通过编写方法来分配和释放内存来实现。

下面是一个管理其内部内存的简单类的示例:

代码语言:javascript
运行
复制
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <sstream>

struct MqlStr
{
public:
    int    len;
    char  *string;

    MqlStr() { init   (); }
   ~MqlStr() { dealloc(); }
    void assign(std::string& str) {
        dealloc();
        string = new char[str.length() + 1];
        strncpy(string, str.c_str(), str.length());
        string[str.length()] = 0;
        len = str.length();
    }
    void dealloc() {
        if(string != 0) delete [] string; init();
    }

private:
    void init() { string = 0; len = 0; }
         MqlStr(const MqlStr &);
    void operator= (const MqlStr &);
};

double CheckExecutionRequests(MqlStr* RequestInfo)
{
    static int callCount = 0;
    std::ostringstream stringstream; stringstream<<"callCount: "<<callCount++;
    std::string field1 = stringstream.str();
    RequestInfo->assign(field1);
    return 1.0;
}

int main(int argc, char** argv)
{
    MqlStr s[5];

    std::cout<<"First call"<<std::endl;
    for(unsigned i = 0; i < sizeof(s)/sizeof(s[0]); ++i)
        CheckExecutionRequests(s + i);

    for(unsigned i = 0; i < sizeof(s)/sizeof(s[0]); ++i)
        std::cout<<"MqlStr["<<i<<"].string = "<<s[i].string<<std::endl;

    std::cout<<"Second call"<<std::endl;
    for(unsigned i = 0; i < sizeof(s)/sizeof(s[0]); ++i)
        CheckExecutionRequests(s + i);

    for(unsigned i = 0; i < sizeof(s)/sizeof(s[0]); ++i)
        std::cout<<"MqlStr["<<i<<"].string = "<<s[i].string<<std::endl;

    return EXIT_SUCCESS;
}

使用相同的MqlStr实例第二次执行CheckExecutionRequests不会损坏内存。代码的扩展可以是字符串大小的预分配,并且仅当新的str.length > this.maxLength (预分配的长度与字符串大小不同)时才在assign方法中重新分配内存。复制构造函数和赋值运算符当前被禁用,因为在管理堆上的内部内存时,如果它们没有正确实现,可能会导致问题。

更简单的解决方案是使用标准容器编写结构,如下所示:

代码语言:javascript
运行
复制
struct MqlStr
{
public:
    std::string string;
}

然后将您为字段获得的字符串分配给MqlStr字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17671784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档