在其他数组上进行类型转换后,在结构中获取第一个char数组

时间:2013-01-12 01:23:56

标签: c arrays pointers casting struct

在类型转换后以正确方式访问结构的某些元素时出现问题。 这是我的代码:

void get_description(struct shmstruct *ptr/*, int number*/) {
    char buff[MESGSIZE];
    struct shmData *dparse;
    snprintf(buff, MESGSIZE, "%s", &ptr->msgdata[0]);
    dparse = (struct shmData *) buff;
    printf("Number: %s", dparse->number);
    printf("Description: %s", dparse->description);
}

现在的问题是,我得到的数字,如123,还有第一个中的描述 line - >
printf(“Number:%s”,dparse-> number);
喜欢:123描述

我怎样才能得到这个号码?

(P.S。

struct shmData{
    char number[4];
    char description[1020];
};

1 个答案:

答案 0 :(得分:1)

听起来这个数字不是终止的。您拥有number字段,然后紧接着您拥有description字段。 printf()假设您正在为它提供一个以空字符结尾的字符串,它会继续运行直到它到达终止的nul字符。在您的情况下,似乎没有终止number字段,因此printf()只是继续前进并获得description

number的所有四个字符都可以用于数字吗?

如果数字只有3位数或更少,那么您可以将终止nul放入number缓冲区。如果您可能需要从那里读取一个4位数字,您需要将数字复制到至少5个字符的临时缓冲区中,然后nul-terminate。

// max 3 digits:
dparse->number[3] = '\0'; // ensure nul-termination of number

// max 4 digits:
#define DPARSE_NUMBER 4  /* size of number field in dparse */
char temp[DPARSE_NUMBER + 1];
strncpy(temp, dparse->number, sizeof(temp));
temp[sizeof(temp) - 1] = '\0'; // strncpy() does not guarantee to nul-terminate, so we must do this

strncpy()不保证终止,这是不幸的。所以我们应该总是在最后一个位置放入一个终止空字符,这样无论如何,它都是空终止的。请注意,有时候strncpy()会给我们带来一些麻烦,但确保一个人在那里并没有坏处。