c - 在对其他数组进行类型转换后获取结构中的第一个字符数组

标签 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 说明

如何只获取号码?

(附言

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

)

最佳答案

听起来这个数字不是以 null 结尾的。您有 number 字段,紧接着您有 description 字段。 printf() 假设您给它一个以 nul 结尾的字符串,它会一直运行直到遇到终止的 nul 字符。在您的情况下,看起来没有 nul 终止 number 字段,所以 printf() 继续前进并获取 description还有。

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

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

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

关于c - 在对其他数组进行类型转换后获取结构中的第一个字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14289235/

相关文章:

Python 将行转换为数组

java - 将数字的控制台输出写入文本文件

c - 如何根据字符串删除链表中的节点

c - 如何 fork 并创建执行相同任务的特定数量的 child ?

c - 如何收集C中的处理时间?

将 char *buffer 中的数据复制/移动到 char info[4][10] 的多维数组

c++ - 错误 : called object type 'double' is not a function or function pointer

c - C 中的这个程序(反转字符串)不起作用是什么?

c - 指针数组中丢失的 valgrind 内存

C - 创建带有值的动态矩阵