1

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

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,而且还有第一行中的描述 ->
printf("Number: %s", dparse->number);
喜欢:123 描述

我怎样才能只得到号码?

(附言

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

)

4

1 回答 1

1

听起来这个数字不是以空结尾的。您拥有该number领域,然后紧随其后您拥有该description领域。 printf()假设您给它一个以 nul 结尾的字符串,并且它将继续运行,直到它遇到终止的 nul 字符。在您的情况下,似乎没有终止该number字段的 nul ,因此printf()请继续前进并获得该字段description

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

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

// 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()不保证 nul 终止,这是不幸的。所以我们应该总是在最后一个位置放一个终止的 nul 字符,这样无论如何,它都是 nul 终止的。请注意,有时strncpy()会为我们放置一个 nul,但确保它在那里并没有什么坏处。

于 2013-01-12T01:29:55.213 回答