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

How to create a jagged string array in c++?

本文关键字:字符串 数组 创建 c++      更新时间:2023-10-16

我想在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

在c++中是这样的:

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

为什么不使用结构体,当它是明智的解决方案,你的问题?

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);

实际上正确的模式" 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));
}

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

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

然后是record[i] = (char*)malloc((arrsize[i]+1) * sizeof(char)),因为字符串是char*,字符是char,因为每个c风格字符串通常以''字符结束,以表示其长度。您可以不使用它,但使用起来会比较困难,例如:

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

来填充您的记录,因为sprintf在末尾添加了。我假设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向量和字符串,您将不必处理难看的内存分配,并且您的代码也可能看起来更干净。