【问题标题】:Reading lines from CSV file and separating into values (sscanf SIGSEGV)从 CSV 文件中读取行并分离为值 (sscanf SIGSEGV)
【发布时间】:2016-08-17 16:15:07
【问题描述】:

我一直在开发一个程序,该程序希望从 csv 文件中读取 10 行并将名称和等级分开。我已经使用了这里提供的文档Reading values from CSV file into variables

不幸的是,我的代码在与sscanf 语句一致时抛出了SIGSEGV。我试图删除%[^,]%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

感谢您的帮助,如果您需要任何其他信息,请随时询问。

【问题讨论】:

  • 它有效,但为什么这里不需要和号?而在另一个线程中它在那里?
  • 我明白了,谢谢你的快速回答!

标签: c scanf


【解决方案1】:

sscanf 的参数不正确,应该是:

sscanf(str[i], "%19[^,], %f", names[i], &grades[i]);

names[i] 是一个char 数组,因此您不应传递其地址,而是传递其第一个元素的地址,即&amp;names[i][0] 或简单的names[i]

相反,grades[i]float。您必须将其地址传递为&amp;grades[i]grades + i,但它的可读性较差。

并且您应该检查返回值以验证输入字符串是否正确转换。

同时删除for 块末尾的额外;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多