srtok не работает в c

вот мой код,

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

main ()
{
    explode (" ", "this is a text");
}

    explode (char *delimiter, char string[])
{
char *pch;
printf ("Splitting string \"%s\" into tokens:\n",string);
pch = strtok (string,delimiter);
while (pch != NULL)
{
    printf ("%s\n",pch);
    pch = strtok (NULL, delimiter);
}
return 0;
}

Я компилирую этот код, используя gcc -o 1.exe 1.c, и не показывает ошибок. Но когда я выполняю 1.exe, он показывает Splitting string "this is a text" into tokens:, и в этот момент 1.exe перестает работать (показывается диалоговое окно окон). кто-нибудь может сказать проблему и решить проблему? Я использую виндовс 10.


person Masum Nishat    schedule 09.03.2016    source источник


Ответы (2)


Хотя вы не можете сделать это с помощью strtok, потому что литерал не может быть изменен, это можно сделать с помощью strcspn.

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

void explode (char *delimiter, char *string);

int main()
{
    explode (" ", "this is a text");
    return 0;
}

void explode (char *delimiter, char *string)
{
    int span = 0;
    int offset = 0;
    int length = 0;

    if ( delimiter && string) {
        length = strlen ( string);
        printf ("Splitting string \"%s\" into tokens:\n",string);
        while (offset < length) {
            span = strcspn ( &string[offset],delimiter);//work from offset to find next delimiter
            printf ("%.*s\n",span, &string[offset]);//print span number of characters
            offset += span + 1;// increment offset by span and one characters
        }
    }
}
person user3121023    schedule 10.03.2016

В вашей функции explode() вы передаете литеральную строку ("this is a text") и используете ее в качестве входных данных для strtok().

Поскольку strtok() изменяет входную строку, здесь она вызывает неопределенное поведение. Как указано в стандарте C11, глава §6.4.5, Строковые литералы.

[...] Если программа пытается изменить такой массив, поведение не определено.

Вы также можете

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

Суть в том, что входная строка для strtok() должна быть модифицируемой.

person Sourav Ghosh    schedule 09.03.2016