如何将字符串类型传递给struct
我想将C中的字符串类型传递给我的如何将字符串类型传递给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(){
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;
如果要将文本放入该结构中,可以将字符串(即achar*
)分配给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
,这是我必须假设的。