2015-10-22 4 views
-1

Я был ослеплен этой «ошибкой». Функция разделяет команду с ее параметрами из строки. Я использую strtok для этого. Я уверен, что это что-то глупое, но я не могу это видеть. Функция:Ошибка сегментации - Strtok - Linux C

int dataCommand(char command[], char *data[]){ 
    char *ch; 
    printf("Split \"%s\"\n", command); 
    ch = strtok(command, "_"); 
    int i = 0; 
    data[i] = ch; 
    printf("%s\n", data[i]); 
    while (ch != NULL) { 
     ch = strtok(NULL, "_"); 
     data[++i] = ch; 
     printf("Valor ch Salida: %s\n", ch); 
    } 
    printf("dataCommand END"); 
    return 0; 
} 

Вызов для этой функции:

char *data[MAX_PARAM]; //MAX_PARAM = 80 
char command[] ="UMBR_Donostia_1_2"; 
dataCommand(command,data); 

Результат на экране:

Split "UMBR_Donostia_1_2" 
UMBR 
Valor ch Salida: Donostia 
Valor ch Salida: 1 
Valor ch Salida: 2 
Segmentation fault (core dumped) 

Я следственную и большинство ошибок я обнаружил, используя символ * over strtok, поэтому они использовали литерал, но im использовали char []. Я не знаю, что еще может быть. Благодарю.

+1

Это, вероятно, сбой в 'printf' потому что вы передаете это нулевой указатель. – melpomene

+1

Вы использовали отладчик, чтобы помочь вам найти проблему? – kaylum

+0

@melpomene исключая все printf, такой же бывает. –

ответ

1

результат моего компилятора для вашей программы:

Split "UMBR_Donostia_1_2" 
UMBR 
Valor ch Salida: Donostia 
Valor ch Salida: 1 
Valor ch Salida: 2 
Valor ch Salida: (null) 

Очевидно вы передаете нулевое значение к нему.

[UPD1]

#include <stdio.h> 
#include <string.h> 

#define MAX_PARAM 80 

int dataCommand(char command[], char *data[]){ 
    char *ch; 
    printf("Split \"%s\"\n", command); 
    int i = 0; 
    ch = strtok(command, "_"); 
    while (ch != NULL) 
    { 
     data[i++] = ch; 
     printf("Valor ch Salida: %s\n", ch); 
     ch = strtok(NULL, "_"); 
    } 
    printf("dataCommand END"); 
    return 0; 
} 

int main() 
{ 
    char *data[MAX_PARAM]; //MAX_PARAM = 80 
    char command[] ="UMBR_Donostia_1_2"; 
    dataCommand(command,data); 
    return 0; 
} 
+0

Возможно, у вас есть более современный компилятор ... но вы все равно не получаете «dataCommand END», почему? и я не получаю этот результат –

+0

Но это обнаруживает вашу ошибку. –

+0

Вы передаете нулевое значение, поэтому просто исправьте его :) –

0

Звоните strtok() в петлю после вы обрабатываете текущий токен.

while (ch != NULL) { 
    printf("Valor ch Salida: %s\n", ch); 
    data[++i] = ch; 
    ch = strtok(NULL, "_"); 
} 

Поскольку вы назвали strtok() первым, вы пропуская первый маркер, и когда вы достигли конца вы призывающую printf() с нулевым указателем.

2

Внутри вашего цикла, вы звоните strtok, чтобы получить следующий токен, но вы не проверяя его на NULL, прежде чем делать что-нибудь с ним.

переформатирования поставить strtok в конце цикла, как так:

int dataCommand(char command[], char *data[]){ 
    char *ch; 
    printf("Split \"%s\"\n", command); 
    int i = 0; 
    ch = strtok(command, "_"); 
    while (ch != NULL) { 
     data[i++] = ch; 
     printf("Valor ch Salida: %s\n", ch); 
     ch = strtok(NULL, "_"); 
    } 
    printf("dataCommand END"); 
    return 0; 
} 

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

+0

Вы правы, купите reduntat код, но все еще получаете ошибку сегментации. –

+1

@ By-Jokese. Вышеприведенный код вместе с тремя строками, которые вы указали для вызывающего с '#define MAX_PARAM 80', компилируется чистым и работает нормально, без каких-либо проблем, сообщаемых valgrind. Проблема может быть в вашем тестовом коде, поэтому опубликуйте это как обновление вопроса. – dbush

0

Попробуйте это:

int 
dataCommand(char *command,char *data[]) 
{ 
    char *ch; 
    int i = 0; 

    while (1) { 
     ch = strtok(command, "_"); 
     command = NULL; 

     if (ch == NULL) 
      break; 

     data[i++] = ch; 
     printf("Valor ch Salida: %s\n", ch); 
    } 

    printf("dataCommand END\n"); 

    return 0; 
} 
Смежные вопросы