ANSI C sscanf给出段错误

时间:2013-11-07 10:24:12

标签: c segmentation-fault scanf

我正在读取“,”分隔的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

2 个答案:

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