0

我正在阅读一个“,”分隔的 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
4

2 回答 2

3

stdin这从文件而不是文件中读取,但它在没有 SEGFAULT 的情况下工作。token != NULL注意before的附加检查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;
}
于 2013-11-07T10:33:41.670 回答
0
#define DELIMITER ','

应该:

#define DELIMITER ","

和:

strtok(temp_line, &DELIMITER);

应该:

strtok(temp_line, DELIMITER);

to 的第二个参数strtok()应该是一个 NUL 终止的字符串,你可能会得到你的段错误,因为它不是,尽管传递NULLsscanf()每个其他答案也不好。颠倒这两行的顺序:

token = strtok (NULL, DELIMITER);
sscanf(token, "%d", &number_coin);

可能是您想要的,否则您不会阅读每行的第一个数字。这样,在循环开始时token总是非非。NULL

于 2013-11-07T12:15:25.313 回答