Функция разделения строки C - PullRequest
1 голос
/ 01 июля 2011

Я пытаюсь реализовать функцию для разделения строк, но я продолжаю получать ошибки сегментации. Я работаю над Windows XP, и поэтому мне также пришлось реализовать strdup (), потому что Windows API не предоставляет его. Может кто-нибудь сказать мне, что не так со следующим фрагментом кода.

char** strspl(char* str, char* del)
{
    int size = 1;

    for(int i = 0; i < strlen(str);) {
        if(strncmp(str + i, del, strlen(del)) == 0) {
            size++;
            i += strlen(del);
        }
        else {
            i++;
        }
    }
    char** res = (char**)malloc(size * sizeof(char*));
    res[0] = strdup(strtok(str, del));
    for(int i = 0; res[i] != NULL; i++) {
        res[i] = strdup(strtok(NULL, del));
    }
    return res;
}

char* strdup(char* str) {
    char* res = (char*)malloc(strlen(str));
    strncpy(res, str, sizeof(str));
    return res;
}

РЕДАКТИРОВАТЬ: с помощью отладчика я обнаружил, что программа падает после следующей строки:

res[0] = strdup(strtok(str,del));

Кроме того, я исправил strdup (), но прогресса до сих пор нет.

Ответы [ 4 ]

1 голос
/ 01 июля 2011

Вы не учитываете нулевой терминатор и копируете неправильное количество байтов

char* strdup(char* str) {
    char* res = (char*)malloc(strlen(str)); /* what about the null terminator? */
    strncpy(res, str, sizeof(str)); /* sizeof(str)
                                    ** is the same as
                                    ** sizeof (char*) */
    return res;
}
0 голосов
/ 01 июля 2011

Есть много вещей, которые не так с этим кодом, но основной недостаток заключается в попытке реализовать эту функцию. Это даст вам только минимальную выгоду, если таковая имеется.

Сравните следующие два фрагмента кода:

/* Using strtok... */
char *tok = strtok(str, del);
while (tok != NULL) {
    /* Do something with tok. */
    tok = strtok(NULL, del);
}

-

/* Using your function... */
char **res = strspl(str, del, &size);
size_t i;
for (i = 0; i < size; i++) {
    /* Do something with *(res + i). */
}
0 голосов
/ 01 июля 2011

malloc не инициализирует выделенную память для \0.Вы пытались использовать calloc вместо этого?Я подозреваю, что ошибки сегмента происходят из-за сравнения res[i] != NULL.

0 голосов
/ 01 июля 2011

Ваша strdup() функция неверна. sizeof(str) - это размер указателя str (вероятно, 4 или 8 байт), а не длина строки . Вместо этого используйте предоставленную библиотеку _strdup().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...