gpt4 book ai didi

c - c中fscanf返回值的问题

转载 作者:行者123 更新时间:2023-12-04 20:56:51 26 4
gpt4 key购买 nike

我很抱歉提出这样的问题(因为网上有太多关于这个的问题)但我不得不问这个问题:

练习涉及从包含学生列表的文件中读取(一条记录包含:名字、姓氏和序列号)。我已经创建了包含 13 行的文档,但是当我在终端 ./a.out 上写入时,输出是一个包含 13 行的此类列表:(null) (空) (空)

代码是:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define EOF (-1)
#define BUF 100

typedef struct stud{
char *surname;
char *name;
char *serial;
} student;

int main(void){
FILE *fd;
int n = BUF;
int k = 0;
int i = 0;
int ret;
char *s = malloc(BUF * sizeof(char));
if((fd = fopen("registry_office_students.txt","r")) == NULL){
perror("error opening file");
return -1;
}
while(fgets(s,n,fd)!=NULL){
k++;
}
student *a = malloc(k*sizeof(student));
rewind(fd);
ret = fscanf(fd, "%s, %s, %s", a[i].surname, a[i].name, a[i].serial);
while(fscanf(fd, "%s, %s, %s", a[i].surname, a[i].name, a[i].serial) == ret){
i++;
}
for(i=0;i<k;i++){
printf("%s, %s, %s \n", a[i].surname, a[i].name, a[i].serial);
}
fclose(fd);
return 0;
}

我再次道歉,希望得到适当的回应,谢谢。

最佳答案

fscanf(3) with %s 不会为字符串分配任何内存。该字符串应该已经存在。

至少,替换

    ret = fscanf(fd, "%s, %s, %s", 
a[i].surname, a[i].name, a[i].serial);

用类似的东西

   {
char surname[48];
char name[64];
char serial[32];
memset (surname, 0, sizeof(surname));
memset (name, 0, sizeof(name));
memset (serial, 0, sizeof(serial));
memset (a+i, 0, sizeof(struct stud));
ret = fscanf(fd, "%47s, %63s, %31s", surname, name, serial);
if (ret==3) {
a[i].surname = strdup(surname);
if (!a[i].surname)
{ perror("strdup surname"); exit(EXIT_FAILURE); }
a[i].name = strdup(name);
if (!a[i].name)
{ perror("strdup name"); exit(EXIT_FAILURE); }
a[i].serial = strdup(serial);
if (!a[i].serial)
{ perror("strdup serial"); exit(EXIT_FAILURE); }
}
}

请注意,我在阅读之前正在清理内存。我明确给出了 fscanf 格式的字符串大小。我正在使用 tested strdup 将读取的字符串复制到堆中。

实际上,我认为您的方法可能是错误的。您可能会决定每个学生都应该在一行中,您可以使用 getline(3) 来读取它。并用 sscanf(3) 解析(也许 %n 会有用!)或者 strtok(或“手动”使用 isalpha)

请阅读更多有关 C 编程的资料,然后使用所有警告和调试信息进行编译 (gcc -Wall -g),学习使用调试器 (gdb)和内存泄漏检测器 ( valgrind )。

关于c - c中fscanf返回值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26086616/

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