在类型转换后以正确方式访问结构的某些元素时出现问题。 这是我的代码:
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];
};
)
答案 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()
会给我们带来一些麻烦,但确保一个人在那里并没有坏处。