Разбивая строку и сохраняя ее в массиве - PullRequest
8 голосов
/ 08 ноября 2011

Я хочу разбить предложение и сохранить каждую строку в массиве. Вот мой код:

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

int main(void)
{
    int i = 0;
    char* strArray[40];
    char* writablestring= "The C Programming Language";
    char *token = strtok(writablestring, " ");


    while(token != NULL)
    {
        strcpy(strArray[i], token);
        printf("[%s]\n", token);
        token = strtok(NULL, " ");
        i++;
    }
    return 0;
}

Это продолжает давать мне ошибку сегментации, и я не могу понять это. Я полагаю, что это связано с тем, что я копирую токен в мой массив.

Ответы [ 2 ]

13 голосов
/ 08 ноября 2011

Это потому что writablestring вообще не доступен для записи. Попытка записи в строковый литерал является неопределенным поведением, и strtok записывает в него (верно, strtok изменяет свой аргумент).

Чтобы все заработало, попробуйте:

char writablestring[] = "The C Programming Language";

Также есть C FAQ .

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

char* strArray[40]; /* Array of 40 char pointers, pointing to nothing. */

Может быть, попробовать это?

/* Careful, strdup is nonstandard. */
strArray[i] = strdup(token);

/* Or this. */
strArray[i] = malloc(strlen(token) + 1);
strcpy(strArray[i], token);
1 голос
/ 08 ноября 2011

Посмотрите на пример в документации :

char * strtok ( char * str, const char * delimiters );

... где ...

ул - C строка для усечения. Содержимое этой строки модифицируется и разбивается на более мелкие строки (токены). В качестве альтернативы может быть указан нулевой указатель, и в этом случае функция продолжает сканирование после завершения предыдущего успешного вызова функции.

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

Возвращаемое значение - Указатель на последний токен, найденный в строке. Пустой указатель возвращается, если для извлечения не осталось токенов.

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

int main(void)
{
    int i = 0;
    const int numOfStrings = 128;
    char* strArray[numOfStrings];
    char writablestring[]= "The C Programming Language";
    char *token = strtok(writablestring, " ");

    for( int j = 0; j < numOfStrings; j++ )
    {
        strArray[j] = new char[40];
    }

    while(token != NULL)
    {
        strcpy(strArray[i], token);
        printf("[%s]\n", token);
        token = strtok(NULL, " ");
        i++;
    }
    return 0;
}
...