我希望将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));
}
答案 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->a
为foo
,mst->b
为bar
。
但是因为你只是在那里卡住了字符,所以这些字符串上没有空填充。 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);
}