Проблемы компиляции на Linux - PullRequest
2 голосов
/ 27 февраля 2012

Итак, я написал следующий код в linux (Ubuntu) с помощью текстового редактора emacs, который, как правило, должен разбивать строку в переданном разделителе. Когда я запускал его, он работал с ошибками, я запускал его через GDB, и он выдает ошибку в strcpy (которую я не вызываю), но, вероятно, неявно выполняется в sprintf. Я не думал, что делал что-то не так, поэтому я загрузился в Windows и запустил его в Visual Studio, и он работает нормально. Я новичок в написании C на Linux и знаю, что проблема в цикле while, где я вызываю sprintf () (который странно, потому что вызов вне цикла записывает без возникновения ошибки) для записи токена в массив. Если кто-то может сказать мне, где я иду не так, я был бы очень признателен. Вот код

/*    split()
 Description:
 - takes a string and splits it into substrings "on" the 
 <delimeter>*/
void split(char *string, char *delimiter)
{
    int i;
    int count = 0;
    char *token;

    //large temporary buffer to over compensate for the fact that we have
    //no idea how many arguments will be passed with a command
    char *bigBuffer[25];

    for(i = 0; i < 25; i++)
    {
        bigBuffer[i] = (char*)malloc(sizeof(char) * 50);
    }

    //get the first token and add it to <tokens> 
    token = strtok(string, delimiter);
    sprintf(bigBuffer[0], "%s", token);

    //while we have not encountered the end of the string keep
    //splitting on the delimeter and adding to <bigBuffer>
    while(token != NULL)
    {
        token = strtok(NULL, delimiter);
        sprintf(bigBuffer[++count], "%s", token);
    }

    //for(i = 0; i < count; i++)
    //printf("i = %d : %s\n", i, bigBuffer[i]);
    for(i = 0; i< 25; i++)
    {
        free(bigBuffer[i]);
    }

} //end split()

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Вы не проверяете NULL из возврата strtok на последней итерации цикла ... так что strtok может вернуть NULL, но вы все равно передаете значение NULL вtoken указатель на sprintf.

Измените цикл while на следующее:

while(token = strtok(NULL, delimiter)) sprintf(bigBuffer[++count], "%s", token);

Таким образом, вы никогда не сможете передать указатель NULL на strtok, потому чтоwhile-loop NULL -pointer check обеспечит, что token всегда имеет допустимое значение, когда sprintf вызывается с ним в качестве аргумента.

0 голосов
/ 27 февраля 2012

Вы должны запросить у gdb полный отчет о том, где произошла ошибка вашей программы. Тот факт, что вы точно не знаете, где произошел сбой, означает, что вы не просили полного отслеживания, что важно.

...