如何在c++中创建锯齿字符串数组
How to create a jagged string array in c++?
我想在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个数字)。我如何实现这一点?我直接将记录数组写入二进制文件。我不想用struct
和class
在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终止符分配一点额外的空间,但这取决于你想在文件中使用的格式。
如果你正在写一个二进制文件,为什么你想写
mark
和id
作为字符串?为什么不存储一个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
在末尾添加了