c - 如何将字符串类型传递给结构体

标签 c

我想将 C 语言中的字符串类型传递给我的 struct

当我使用这个从文件中获取时:

int fd = open("file.txt",O_RDONLY);
read(fd, &mst, sizeof(struct my_struct);

没问题。但我想从 char * 类型获取,是否存在某种方法使用 read 方法从 const char * 类型获取?

typedef struct{
    char a[3];
    char b[3];
}my_struct;

int main(){
    const char *str = "qwerty";
    my_struct mst;
    read(str,&mst, sizeof(my_struct));
}

最佳答案

直接从文本文件读取到结构中......很奇怪。直接读取结构通常意味着您正在加载二进制数据结构,而不是文本。

它“有效”,因为你的结构设置得很奇怪。普通的结构体使用指针来存储字符串,就像这样。

typedef struct {
    char *a;
    char *b;
} normal_struct;

如果您想将文本放入该结构中,您可以将一个字符串(即 char *)分配给 thing->a事物->b.

/* Allocate memory for the string in the struct */
thing->a = malloc(...);

...use thing->a like any other char *...

因此,您将 read() 写入 thing->a,而不是写入 thing

char * 放入此结构中很容易。只需分配它...并确保释放 thing->a 中已有的内容。

if( thing->a != NULL )
    free(thing->a);

thing->a = str;
<小时/>

您所做的是创建一个具有固定大小字符串的结构。

typedef struct {
    char a[3];
    char b[3];
} my_struct;

前三个字节是a,后三个字节是b

当您my_struct时,文本文件的前3个字节变成a,第二个变成b >。如果文件是 foobarbaz,则 mst->afoomst->bbar .

但是由于您只是在其中插入了字符,因此这些字符串上没有空填充。 C 不知道它们有多长。像 printf("%s\n", mst->a) 这样的东西很可能会产生 foobarald;kfjl2 因为它在结构体外部读取垃圾,直到它碰巧看到空。

出于这个原因以及许多其他原因,您最好使用 char * 构建结构。

关于c - 如何将字符串类型传递给结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35731392/

相关文章:

c++ - 内存对齐结构 - 对齐大小等于最大成员大小

c - 当strstr找到指定字符串时如何增加变量

c - 强制 .so 模块使用 libc 函数以防重复函数

c++ - 两个非常大的数的除法

c - 基于文本语言的决策

C 代码因 memmove 崩溃

c - AVR gcc,奇怪的数组行为

c - 如何增加程序的输入大小

c++ - %*c 是什么意思?

Char* 和 byte* 相等比较(数字和文本)