我一直在研究一个想要从csv文件中读取10行并将名称和等级分开的程序。我使用了此处提供的文档Reading values from CSV file into variables
不幸的是,我的代码在使用SIGSEGV
语句到达时会抛出sscanf
。我试图删除,
和%[^,]
之间的%f
,之后它会起作用,但只会获取名称,而不是等级,这会使目的失败。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[10][30], names[10][20];
FILE *fp;
int i;
float grades[10];
fp = fopen("names.txt", "rt");
for (i = 0; i < 10; i++) {
fgets(str[i], 30, fp);
sscanf(str[i], "%[^,], %f", &names[i], grades[i]);
printf("%s ", names[i]);
printf("%f ", grades[i]);
};
}
这是csv文件的内容:
Bob,8
Carla,7
Jack,5
Julie,3
Goncalo,9
Vera,6
Jesse,8
James,8
Francis,10
Monica,6
感谢您的帮助,如果您需要任何其他信息,请不要犹豫。
答案 0 :(得分:1)
sscanf
的参数不正确,应为:
sscanf(str[i], "%19[^,], %f", names[i], &grades[i]);
names[i]
是char
数组,因此您不应传递其地址,而应传递其第一个元素的地址,即&names[i][0]
或names[i]
。< / p>
相反,grades[i]
是float
。您必须将其地址作为&grades[i]
或grades + i
传递,但不太可读。
您应该检查返回值以验证输入字符串是否已正确转换。
同时删除;
块末尾的额外for
。