2016-03-01 68 views
-1

我想將C中的字符串類型傳遞給我的struct。使用這種如何將字符串類型傳遞給struct

當我從文件中獲取:

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

是所有權利。但我想從char *類型中獲得,是否存在某種使用讀取方法從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

不要描述你的代碼不工作,顯示它。 –

+2

您可能需要'strncpy()',而不是'read()' – mustaccio

+0

注意:'char *'是一個**指針**。在C中,字符**數組中的_string_直到包括終止空字符。 – chux

回答

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

從文本文件直接讀入結構是...奇怪。直接讀取結構通常意味着您正在加載二進制數據結構,而不是文本。

它「工作」,因爲你的結構奇怪地設置。正常的結構使用指針來存儲字符串,就像這樣。

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

如果你希望把文本插入結構,你分配一個字符串(即一個char *)要麼thing->athing->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,因爲它在結構之外讀取垃圾,直到碰巧看到null。

爲此以及其他許多原因,您最好使用char * s構建結構。

+0

對於包含數組的結構,它不是「奇怪」或非正常的 –

+0

@MM I確實有理由這麼做,例如一個三個小小的小旗子,但它不太可能適用於海報的問題。 – Schwern

+0

好吧,他確實說過:'read(fd,&mst,sizeof(struct my_struct));'正常工作 –