gpt4 book ai didi

c - 如何使用 fscanf 或 fgets 在结构中动态分配字符串?

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:11 26 4
gpt4 key购买 nike

我正在尝试使用 fscanf 在结构中分配一个字符串,我试过这个:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <Windows.h>
#include <string.h>

typedef struct _SPerson {
char *name;
char *surname;
char *id;
char *telephone;
}SPerson;

void main (void) {
unsigned int ne;
SPerson Archive[1000];
Load(Archive,&ne);
}

int Load(SPerson Archive[],unsigned int *ne) {
int k,i=0;
char s[4][20];
FILE *f;
f = fopen("archive.txt","r");
if(f==0) return 0;

while((k=fscanf(f,"%s %s %s %s",s[0],s[1],s[2],s[3]))==4) {
Archive[i].id = (char*) malloc( sizeof(char) *strlen(s[0]));
Archive[i].id =s[0];
Archive[i].name = (char*) malloc( sizeof(char) *strlen(s[1]));
Archive[i].name = s[1];
Archive[i].surname = (char*) malloc( sizeof(char) *strlen(s[2]));
Archive[i].surname = s[2];
Archive[i].telephone = (char*) malloc( sizeof(char) *strlen(s[3]));
Archive[i].telephone =s[3];
i++;
}

*ne = i;
fclose(f);
return 1;
}

也许在我看来它是正确的,但是在加载数据时出了点问题,那么这是动态读取字符串的正确且清晰的方法吗?我想用fgets,但是我的字符串是用空格分隔的,所以我需要实现另一个功能,拆分。谁能帮帮我?

最佳答案

 while((k=fscanf(f,"%s %s %s %s",s[0],s[1],s[2],s[3]))==4) {
//your code
i++;
}

而不是使用 fgets 读取完整数据,然后使用 strtok 对其进行标记化 -

char data[1024],*token;
int j=0;
while(fgets(data,sizeof data,f)!=NULL){ //read from file
token=strtok(data," "); //tokenize data using space as delimiter
while(token!=NULL && j<4){
j=0;
sprintf(s[j],"%s",token); //store it into s[i]
j++;
token=strtok(NULL," ");
}
Archive[i].id = malloc(sizeof *Archive[i].id * (strlen(s[0])+1)); //allocate memory
strcpy(Archive[i].id,s[i]); //copy at that allocated memory
//similar for all
i++;
}

这可以用来代替你的循环。

注意 - 不要这样做 -

 Archive[i].id = (char*) malloc( sizeof(char) *(strlen(s[0])+1)); 
Archive[i].id =s[0]; <-- 2.

2. 语句之后,您将失去对先前分配的内存的引用,并且将无法释放它——导致内存泄漏。

这对于以下所有此类语句都是相同的。

关于c - 如何使用 fscanf 或 fgets 在结构中动态分配字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34669240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com