如何创建多个以null结尾的char数组?

时间:2016-02-13 12:41:11

标签: c

我有一个char数组,我希望它具有某种格式,例如:

  

(前4个字节)块类型
  (接下来的4个字节)错误代码
  (接下来的32个字节)   电子邮件地址
  (下一个64字节)家庭地址
  (接下来的32个字节)全名

等等。大约45个不同的字段用0到字段大小填充。我可以使用memcpy并每次按字段大小推进指针,但它看起来像一个单调乏味的任务和丑陋的代码。也许是一种更聪明,更优雅的方式来创建这样的格式?

4 个答案:

答案 0 :(得分:3)

您可以使用unionstruct一起执行此操作:

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

这真是一项乏味的任务。但似乎没有更好的方法。

也许你可以将它们隐藏在函数中,而不会考虑内部的丑陋代码。