我正在读取“,”分隔的CSV文件,并尝试使用sscanf将令牌转换为整数并获取段错误。
这是我的代码:
#define MAX_LINE_SIZE 1024
#define DELIMITER ','
void load_data(char * coinsfile)
{
char temp_line[MAX_LINE_SIZE];
char * token;
int number_coin;
while (fgets(temp_line, MAX_LINE_SIZE, coins_file) != NULL) {
token = strtok (temp_line, DELIMITER);
while(token != NULL) {
token = strtok (NULL, DELIMITER);
sscanf(token, "%d", &number_coin);
}
}
}
测试CSV文件:
5,10
10,5
20,8
50,2
100,20
200,8
答案 0 :(得分:3)
这是从stdin
而不是文件中读取的,但它在没有SEGFAULT的情况下有效。请注意token != NULL
之前sscanf()
的额外检查。
示例输入:
12;22;
代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LINE_SIZE 1024
#define DELIMITER ";"
int main(int argc, char** argv){
char temp_line[MAX_LINE_SIZE+1];
char * token;
int number_coin;
while (fgets(temp_line, MAX_LINE_SIZE, stdin) != NULL) {
token = strtok (temp_line, DELIMITER);
while(token != NULL) {
token = strtok (NULL, DELIMITER);
if(token != NULL)
sscanf(token, "%d", &number_coin);
}
}
return 0;
}
答案 1 :(得分:0)
#define DELIMITER ','
应该是:
#define DELIMITER ","
和
strtok(temp_line, &DELIMITER);
应该是:
strtok(temp_line, DELIMITER);
strtok()
的第二个参数应该是一个NUL终止的字符串,你可能会得到你的段错误,因为它不是,虽然根据另一个答案将NULL
传递给sscanf()
也不是好。颠倒这两行的顺序:
token = strtok (NULL, DELIMITER);
sscanf(token, "%d", &number_coin);
可能是您的意图,否则您不会读取每行的第一个数字。
token总是非NULL
。