如何将字符串类型传递给struct

如何将字符串类型传递给struct,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(){

我想将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;
如果要将文本放入该结构中,可以将字符串(即a
char*
)分配给
thing->a
thing->b

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

...use thing->a like any other char *...
所以你应该把()读入
东西->一个
,而不是读入
东西

char*
放入此结构很容易。只要分配它。。。并且一定要释放
东西->a
中已经存在的东西

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

thing->a = str;

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

typedef struct {
    char a[3];
    char b[3];
} my_struct;
前三个字节是
a
,后三个字节是
b

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

...use thing->a like any other char *...
当您将
读入
my_struct
时,文本文件的前3个字节变成
a
,第二个变成
b
。如果文件为
foobarbaz
,则
mst->a
foo
mst->b
bar

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


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

谢谢tips,我用这个函数解决了我的问题。

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct __attribute__((__packed__)){
    char *s;
    int *x;
}my_struct;

void *chr2struct(const char *text){
    char c;
    my_struct *mst = (my_struct *) malloc(sizeof(my_struct));
    void **swap = (void **) malloc(sizeof(my_struct));
    void **res = swap;

    if(!text)
        return 0;

    int i;
    while(*text){
        c = *text;
        text++;
        char str[32];
        int x, len;
        char *data;
        switch(c){
            case 's':
            case 'c':
                sscanf(text,"%[^\037]",str);
                text += strlen(str)+1;
                len = atoi(str);
                data = (void *) malloc(sizeof(char)*len);
                strcpy(data,text);
                text+= len+1;
                swap[i] = data;
                break;
            case 'i':
                sscanf(text,"%[^\037]",str);
                text += strlen(str)+1;
                len = atoi(str);
                data = (void *) malloc(sizeof(int)*len);
                for(x=0; x<len; x++){
                    sscanf(text,"%i",&data[x]);
                    sprintf(str,"%i",data[x]);
                    text+=strlen(str)+1;
                    swap[i] = *data;
                }
                break;
            default:
                return 0;
        }
        i++;
    }

    return res;
}

int main(int argc, char *argv[]){
    my_struct *mst;
    mst = (my_struct *) chr2struct("s16\037qwertyuiopasdfgh\0i1\03716\0");
    printf("%s | %i\n", mst->s, mst->x);
}
#包括
#包括
#包括
typedef结构uuu属性uuu((uuu打包uuu)){
char*s;
int*x;
}我的结构;
void*chr2struct(常量字符*文本){
字符c;
my_struct*mst=(my_struct*)malloc(sizeof(my_struct));
void**swap=(void**)malloc(sizeof(my_struct));
void**res=掉期;
如果(!text)
返回0;
int i;
while(*文本){
c=*文本;
text++;
char-str[32];
int x,len;
字符*数据;
开关(c){
案例s:
案例“c”:
sscanf(文本“%[^\037]”,str);
text+=strlen(str)+1;
len=atoi(str);
数据=(void*)malloc(sizeof(char)*len);
strcpy(数据、文本);
text+=len+1;
交换[i]=数据;
打破
案例“i”:
sscanf(文本“%[^\037]”,str);
text+=strlen(str)+1;
len=atoi(str);
数据=(void*)malloc(sizeof(int)*len);
对于(x=0;xs,mst->x);
}

不要描述不起作用的代码,展示它。你可能想要
strncpy()
,而不是
read())
注意:
char*
是一个指针。在C语言中,字符数组中的一个字符串,最多包含终止的空字符。它起作用了,但尝试在struct中添加一个
int
字段却不起作用。什么是
my_struct
?它从未声明过。它不是“奇数”或结构包含的非正常值arrays@M.M我确信这样做是有原因的,比如一个小的三个字符的标志,但它们不太可能适用于海报的问题。他确实说过
read(fd,&mst,sizeof(struct my_struct));
工作正常correctly@M.M不,它似乎正常工作。试图使用
read()的人
若要将字符串复制到结构中,并发布带有语法错误的代码,则无法评估C代码是否正常工作。缺少有关读取内容的更多信息,以及它来自
.txt
文件,而该文件不知道
str*cpy
,这是我必须假设的。