如何在c ++中创建锯齿状的字符串数组?

时间:2011-11-03 06:42:07

标签: c++ jagged-arrays

我想在c ++中创建锯齿状的二维数组。

int arrsize[3] = {10, 5, 2};
char** record;
record = (char**)malloc(3);
cout << endl << sizeof(record) << endl;
for (int i = 0; i < 3; i++) 
{
    record[i] = (char *)malloc(arrsize[i] * sizeof(char *));
    cout << endl << sizeof(record[i]) << endl;
}

我想为record[0]设置名称(应该有10个字母),record[1]用于标记(应该有5位数字)和record[3]用于ID(应该有2位数字) 。我该如何实现呢?我直接将记录数组写入二进制文件。我不想使用structclass

4 个答案:

答案 0 :(得分:5)

在C ++中它想要这样:

std::vector<std::string> record;

答案 1 :(得分:2)

为什么在你的问题是明智的解决方案时不使用结构?

struct record {
   char name[10];
   char mark[5];
   char id[2];
};

然后写入二进制文件变得微不足道了:

record r = get_a_record();
write( fd, &r, sizeof r );

注意:

  • 您可能希望为NUL终结器分配一些额外空间,但这取决于您要在文件中使用的格式。

  • 如果您要写入二进制文件,为什么要将markid写为字符串?为什么不存储int(4个字节,更大范围的值)和unsigned char(1个字节)

如果你坚持不使用用户定义的类型(真的,你应该),那么你可以创建一个单独的内存块并使用指针算法,但要注意编译器生成的二进制文件将是相同的,唯一的区别是你的代码可维护性较差:

char record[ 10+5+2 ];
// copy name to record
// copy mark to record+10
// copy id to record+15
write( fd, record, sizeof record);

答案 2 :(得分:0)

实际上,“to malloc”的正确模式是:

T * p = (T *) malloc(count * sizeof(T));

其中T可以是任何类型,包括char *。因此,在这种情况下分配内存的正确代码就是:

int arrsize[3] = { 10, 5, 2 };
char** record;
record = (char**) malloc(3 * sizeof(char *));
cout << sizeof(record) << endl;
for (int i = 0; i < 3; ++i) {
    record[i] = (char *) malloc(arrsize[i] * sizeof(char));
}

我删除了cout'ing sizeof(record[i]),因为它总是会产生(一个)指向char的指针(我的笔记本电脑上有4个)。 sizeof是编译时间的东西,不知道record[i](实际上是指针 - char *类型)在执行时间内分配了多少内存。

答案 3 :(得分:0)

malloc(3)分配3个字节。您的锯齿状数组将是一个包含指向字符数组的指针的数组。每个指针通常占用4个字节(在32位机器上),但更正确sizeof(char*),因此您应该使用malloc(3 * sizeof(char*) )进行分配。

然后record[i] = (char*)malloc((arrsize[i]+1) * sizeof(char)),因为字符串是char*而字符是char,并且因为每个C风格的字符串通常以'\0'字符终止表明它的长度。你可以没有它,但例如它会更难使用:

strcpy(record[0], name);
sprintf(record[1], "%0.2f", mark);
sprintf(record[2], "%d", id);

填写您的记录,因为sprintf最后会放入\0。我假设mark是一个浮点数,id是一个整数。

关于将所有这些写入文件,如果文件是二进制文件,为什么首先将所有内容放入字符串中? 假设你这样做,你可以使用类似的东西:

ofstream f("myfile",ios_base::out|ios_base::binary);
for (int i=0; i<3; i++)
    f.write(record[i], arrsize[i]);
f.close();

话虽这么说,我是安德斯的第二个想法。如果你使用STL向量和字符串,你将不必处理丑陋的内存分配,你的代码也可能看起来更干净。