从CSV文件中读取行并分成值(sscanf SIGSEGV)

时间:2016-08-17 16:15:08

标签: c scanf

我一直在研究一个想要从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

感谢您的帮助,如果您需要任何其他信息,请不要犹豫。

1 个答案:

答案 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