2013-11-07 5 views
0

Я читаю CSV-файл с разделителями и пытаюсь преобразовать токен в целое число с sscanf и получить ошибку segfault.ANSI C sscanf дает segfault

Вот мой код:

#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

Показать, пожалуйста, весь код, который может повлиять на это - включая объявление переменной temp_line и coins_File и строки строк из вашего csv. Но вы не тестируете токен против NULL перед sscanf(). – Constantin

+0

@Constantin Я добавил запрашиваемую информацию 'coins_file' - это имя файла CSV-файла, который исходит из другого кода – Oscar

ответ

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; 
} 
+0

Это неправильно, поскольку вы не передаете завершенную строку NUL как второй аргумент' strtok() '. Вы получаете неопределенное поведение столько раз, сколько ввод содержит символы, которые не являются ''; ''. –

+0

@PaulGriffiths Вы правы - я исправил это. – Constantin

+0

+1 после исправления. –

0
#define DELIMITER ',' 

Должно быть:

#define DELIMITER "," 

и:

strtok(temp_line, &DELIMITER); 

должен быть:

strtok(temp_line, DELIMITER); 

Второй аргументом strtok() должен быть завершенным нуль строки, вы, вероятно, получить свой Segfault, потому что это не так, хотя прохождение NULL к sscanf() за другой ответ тоже не хорошо , Реверсивный порядок этих двух линий:

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

может быть то, что вы хотели, в противном случае вы не читаете в первый номер в каждой строке. token всегда будет NULL в начале цикла, таким образом.

Смежные вопросы