Ошибка сегментации с использованием strtok() в C

Я получаю ошибку сегментации со следующим кодом, используя strtok. Правильно ли я использую strtok?

int main()
{
    dummy("90:90");
    return 0;
}
int dummy(char *str)
{
    char *mm, *hh;
    int len = strlen(str), result;

    if (len <= 0 || len > 5)
    {
            return 0;
    }

    hh = strtok(str, ":");

    while(hh){
        printf("%s", hh);
        hh = strtok(NULL, ":");
    }

return result;
}

person codey modey    schedule 12.02.2014    source источник


Ответы (3)


вы не можете использовать strtok() с постоянной строкой. И это то, что вы сделали в своем коде.

Поскольку strtok() редактирует строку, а постоянные строки являются строками только для чтения.

Чтобы решить вашу проблему, продублируйте свою строку в динамической выделенной памяти (память для чтения и записи) следующим образом:

int dummy(char *str)
{
    char *mm, *hh;
    int len = strlen(str), result;

    if (len <= 0 || len > 5)
    {
            return 0;
    }

    char *buf = strdup(str); // Modif here


    hh = strtok(buf, ":"); // Modif here

    while(hh){
        printf("%s", hh);
        hh = strtok(NULL, ":");
    }

    free(buf); // Modif here

    return result;
}
person MOHAMED    schedule 12.02.2014

strtok изменил содержимое своего аргумента, поэтому вы не можете передать строковый литерал. Измените его на:

int main()
{
    char str[] = "90:90";
    dummy(str);
    return 0;
}
person Yu Hao    schedule 12.02.2014

Когда функция strtok вызывается с первым аргументом, являющимся строкой, отличной от NULL, она изменяет содержимое этой строки, так что при следующих вызовах (с NULL) она сможет получить следующий токен.

Однако вы передаете постоянную строку, которая находится в (доступном только для чтения) разделе кода вашей программы. Таким образом, во время выполнения ЦП пытается выполнить запись в раздел памяти, доступный только для чтения, что приводит к нелегальному доступу к памяти.

Короче говоря, вам нужно объявить строку как локальный массив в стеке функции main:

int main()
{
    char str[] = "90:90";
    dummy(str);
    return 0;
}
person barak manos    schedule 12.02.2014