簡體   English   中英

如何在C ++中的結構內的結構數組內填充字符串

[英]How to fill a String inside an array of structures within a structure in C++

因此,我有一個名為fastarray的結構,其中包含指向另一個稱為token_det的結構的指針。 我的問題是嘗試填充結構數組中的char數組失敗,並且過程中出現錯誤消息,提示為“應用程序在位置0x78b2ae6e發生了未知的軟件異常(0x0000417)”。 我嘗試使用malloc增加char數組的大小,但是在合並了幾個字符串后,字符串concat函數仍然失敗。 下面是代碼示例:

#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream.h>

using namespace std;

#define MAX_TOKENS 300000

struct token_det
{
    int token;

    std::string data;
    char mdepth[300];

};

typedef struct fastarray
{
    token_det *td;  //MAX_TOKENS
}FASTARRAY;


int main()
{
    printf("inside main\n");

    int lv_ret = 0;
    int count = 0;
    char log[50] = {""};
    int wtoken = 0;

    FASTARRAY *f_array = NULL;

    f_array = (FASTARRAY *)malloc(sizeof(FASTARRAY));
    f_array->td = NULL;
    f_array->td = (token_det *)malloc(MAX_TOKENS * sizeof(token_det));

    printf("after malloc\n");

    memset(f_array, 0, sizeof(f_array));
    memset(f_array->td, 0, sizeof(f_array->td));

    int x=0;
    while(x<=10000)
    {
        printf("inside while");
        f_array->td[x].data = "104,";

        f_array->td[x].data.append("stasimorphy");  
        f_array->td[x].data.append(",");

        f_array->td[x].data.append("psychognosy");
        f_array->td[x].data.append(",");

        f_array->td[x].data.append("whoever");
        f_array->td[x].data.append(",");

        x++;

        sprintf_s(log,sizeof(log),"Data for x-%d = %s\n",x,f_array->td[x].data);
        printf(log);
    }

    free(f_array->td);
    free(f_array);

    printf("after while\n");
    return 0;
}

解釋我在做什么以及為什么

當我試圖了解您想做什么時,除了您使用memset的部分之外,我沒有任何問題。 使用memset(f_array, 0, sizeof(f_array)); 您正在顯式地將f_array設置為指向內存中的0,這一直在為我拋出異常。

因為我從未真正成為malloc的朋友,所以我一直在使用C ++語法,如下所示:

為了分配單個實例,我將使用FASTARRAY *f_array = new fastarray; 您可以在此處閱讀有關為什么在C ++中使用new而不是malloc原因。

以相同的方式,我一直在使用C ++語法分配動態數組f_array->td = new token_det[MAX_TOKENS]; 您可以在此處找到有關該主題的問答,以供參考。

我認為,要在動態數組的結構內填充數據字符串,我一直在使用+=語法,因為它更易於閱讀。 使用(*(f_array->td + x)).data += "stasimorphy";訪問f_array內部的元素f_array (*(f_array->td + x)).data += "stasimorphy";

您可以在此處在線嘗試我的解決方案。

代碼轉儲

我嘗試了盡可能少的更改以使其正常運行。

#include <sstream>
#include <string>
#include <iostream>

using namespace std;

#define MAX_TOKENS 300000

struct token_det
{
    int token;

    std::string data;
    char mdepth[300];

};

typedef struct fastarray
{
    token_det *td;  //MAX_TOKENS
}FASTARRAY;


int main()
{
    std::cout << "inside main\n";

    int lv_ret = 0;
    int count = 0;
    char log[50] = { "" };
    int wtoken = 0;

    FASTARRAY *f_array = new fastarray;
    f_array->td = new token_det[MAX_TOKENS];

    std::cout << "after malloc\n";

    int x = 0;
    while (x <= 10000)
    {
        std::cout << "inside while";
        std::stringstream log;
        (*(f_array->td + x)).data = "104,";

        (*(f_array->td + x)).data += "stasimorphy";
        (*(f_array->td + x)).data += ",";

        (*(f_array->td + x)).data += "psychognosy";
        (*(f_array->td + x)).data += ",";

        (*(f_array->td + x)).data += "whoever";
        (*(f_array->td + x)).data += ",";

        log << "Data for x-" << x << " = " << (f_array->td + x)->data << std::endl;
        std::cout << log.str();

        x++;
    }

    delete[] f_array->td;
    free(f_array);

    std::cout << "after while\n";
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM