2013-03-23 6 views
0

Эй, ребята, я получаю ошибку seg с strtok, просто нужно немного помочь!Seg fault with strtok

char s[1024]; 
char *token[2]; 
while(fgets(s, sizeof(s), fp) != NULL) // Read line from file fp until end 
{ 
    token[0] = strtok(s, "\t\n"); 
    token[1] = strtok(NULL, "\t\n"); 
    token[2] = strtok(NULL, "\t\n"); 
    printf("%d:%s:%d", atoi(token[0]), token[1], atoi(token[2])); 
} 

Но я получаю ошибку seg после первой пасхи цикла. Файл вход читает что-то вроде этого:

102910319 code mark 
. 
. 
. 
104981851 code mark 

Но цикл пока только печатает первую строку правильно и SEG ошибки на второй линии.

Любые идеи, почему?

Спасибо.

+4

Мое первое предположение: вы объявили 'токен [2]', но вы получаете доступ к 3 элементам – Jack

+0

также возможно, после исправления объявления массива у вас могут возникнуть проблемы с данными: - белые символы между столбцами отличны от \ t. –

+0

Исправлено, но все равно получить сбой! @jimmcnamara Нет, они все \ t (вкладки). – Travv92

ответ

0

Как сказал Джек, маркер объявляется хранить два char * S: token[0] и token[1]. token[2] вне допустимого диапазона. Решением этого является изменение вашей декларации токена: char *token[3];.

Кроме того, возможно, что вы предоставили меньше трех «слов» ввода, где %s будет указывать printf для печати строки, на которую указывает нулевой указатель, или второй вызов atoi будет пытаться разыменовать нулевой указатель. Решение состоит в том, чтобы проверить token[1] перед передачей его Printf и token[2] перед передачей его atoi: printf("%d:%s:%d", atoi(token[0]), token[1] ? token[1] : "null", token[2] ? atoi(token[2]) : 0);

С другой стороны, это выглядит как зсапЕ может быть более подходящим для этого:

int x, y; 
char str[1024]; 
while (scanf("%d %1023s %d", &x, str, &y) == 3) { 
    printf("%d:%s:%d\n", x, str, y); 
} 
+0

Спасибо, я нашел проблему. Было то, что предоставленный текстовый файл для ввода имел ошибку, когда одна из «вкладок» была фактически несколькими пробелами. Исправлена ​​ошибка, и она срабатывала! – Travv92

+0

@ Travv92 Код сканирования, который я опубликовал, успешно обработает повторяющиеся вкладки, пробелы и символы новой строки (в любой комбинации) ... Следовательно, я считаю, что scanf будет более подходящим. – Sebivor

2

Array индексирование проблема.

Вы должны объявить массив указателей следующим образом,

char *token[3]; 
+0

Изменено на 3 и по-прежнему та же ошибка. – Travv92

0

Вы делаете это

char *token[2] 

Он может выделять только два указателя на символ, а не три.