我有一个char数组,我希望它具有某种格式,例如:
(前4个字节)块类型
(接下来的4个字节)错误代码
(接下来的32个字节) 电子邮件地址
(下一个64字节)家庭地址
(接下来的32个字节)全名
等等。大约45个不同的字段用0到字段大小填充。我可以使用memcpy
并每次按字段大小推进指针,但它看起来像一个单调乏味的任务和丑陋的代码。也许是一种更聪明,更优雅的方式来创建这样的格式?
答案 0 :(得分:3)
您可以使用union
和struct
一起执行此操作:
#define BLOCK_TYPE_SIZE 4
#define ERROR_CODE_SIZE 4
#define EMAIL_ADDRESS_SIZE 32
#define HOME_ADDRESS_SIZE 64
#define FULL_NAME_SIZE 32
struct format_entry
{
char block_type[BLOCK_TYPE_SIZE];
char error_code[ERROR_CODE_SIZE];
char email_address[EMAIL_ADDRESS_SIZE];
char home_address[HOME_ADDRESS_SIZE];
char full_name[FULL_NAME_SIZE];
};
union format_union
{
char full_string[sizeof(struct format_entry)];
struct format_entry entry;
};
然后你可以像这样填写:
union format_union f;
memset (f.full_string, 0, sizeof f.full_string);
strcpy (f.entry.block_type, "TYPE");
strcpy (f.entry.error_code, "CODE");
strcpy (f.entry.email_address, "EM@AI.L");
strcpy (f.entry.home_address, "ADDR");
strcpy (f.entry.full_name, "NA ME");
答案 1 :(得分:1)
strncpy()
,尽管它的名字是不 a"字符串"功能
char data[136/* maybe add 1 for extra '\0' */] = {0}; // fill array with zeroes
strncpy(data, "block type", 4);
strncpy(data + 4, "error code", 4);
strncpy(data + 8, "email address", 32);
strncpy(data + 40, "home address ...", 64);
strncpy(data + 104, "Full Name even if it is very very long", 32);
答案 2 :(得分:1)
要添加到Nick的回复,在C,但不是C ++,,您可以跳过联合并直接将结构归零:
struct format_entry { char block_type[BLOCK_TYPE_SIZE]; char error_code[ERROR_CODE_SIZE]; char email_address[EMAIL_ADDRESS_SIZE]; char home_address[HOME_ADDRESS_SIZE]; char full_name[FULL_NAME_SIZE]; }; struct format_entry data; memset( &data, 0, sizeof data ); /* zero-fill structure */
如果您稍后需要更新某些字段,也可以考虑制作自己的填充例程以确保零填充。
char *strncpy0( char *target, const char *source, size_t s ) { memset( target, 0, s ); strncpy( target, source, s ); return target; }
虽然上面的代码对于C的早期用户来说更安全,但为了提高效率,你可以计算strncpy()不会触及的目标末尾的字节数,然后只填充这些字节。
答案 3 :(得分:0)
这真是一项乏味的任务。但似乎没有更好的方法。
也许你可以将它们隐藏在函数中,而不会考虑内部的丑陋代码。