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

时间:2016-03-01 19:11:05

标签: 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));
}

2 个答案:

答案 0 :(得分:1)

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

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

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

如果您想将文本放入该结构中,您需要为char *thing->a分配一个字符串(即thing->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

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

但是因为你只是在那里卡住了字符,所以这些字符串上没有空填充。 C不知道他们有多久。像printf("%s\n", mst->a)这样的东西可能会产生foobarald;kfjl2,因为它会在结构体外部读取垃圾,直到看到它为止。

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

答案 1 :(得分:0)

感谢提示家伙,我使用此功能解决了我的问题。

#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);
}