Использование strsep () с динамическим массивом строк в C - PullRequest
1 голос
/ 26 мая 2009

У меня есть следующий код:

#include <string.h>

int main(void) {
    char *buffer = NULL, **words = NULL, *aPtr = NULL, *sPtr;
    int count = 0;

    buffer = strdup("The quick brown fox jumps over the lazy dog");
    sPtr = buffer;

    do {
        aPtr = strsep(&sPtr, " ");

        words[count++] = ... // missing code
    } while(aPtr);

    return 0;
}

Мне не хватает некоторого кода, как вы можете видеть выше ... Есть ли какой-либо тип strdup (), который работает в этой ситуации? Кажется, сама функция strdup () не работает ... Если ее нет, как я могу заставить этот кусок кода работать?

Указатель указателя - это головная боль для меня ...

Ответы [ 6 ]

2 голосов
/ 26 мая 2009

вы можете использовать что-то простое, если просто попробуете:

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

#define MAX_WORDS 100

int main(void) {
    char *buffer, *words[MAX_WORDS], *aPtr;
    int count = 0, i;

    buffer = strdup("The quick brown fox jumps over the lazy dog");
    if (!buffer) return 1;

    do {
        aPtr = strsep(&buffer, " ");
        if (aPtr && count < MAX_WORDS) words[count++] = aPtr;
    } while(aPtr && count < MAX_WORDS);

    for (i = 0; i < count; i++) {
        printf("%s\n", words[i]);   
    }
    return 0;
}

работает:

[macbook:~] jianlin $ ./a.out
The
quick
brown
fox
jumps
over
the
lazy
dog
[macbook:~] jianlin $ 
2 голосов
/ 26 мая 2009

Вам нужно выделить место для массива words, что-то вроде:


#define MAX_NUM_WORDS 1024
...
/* on the stack */
char* words[MAX_NUM_WORDS];
...
/* or on the heap */
char** words;
if (( words = ( char** )malloc( MAX_NUM_WORDS * sizeof( char* ))) == NULL )
{
    perror( "malloc" );
    exit( 1 );
}

Или еще лучше - используйте динамическую структуру данных, как односвязный список.

2 голосов
/ 26 мая 2009

Пока вы еще не выделили words[0], words[1], ... поэтому использование strdup не помогает.

Хуже того, вы заранее не знаете, сколько слов будет, поэтому не просто malloc пространство, которое вам нужно.

Один из вариантов - заменить words на связанный список или динамический массив.

1 голос
/ 26 мая 2009

цикл выше был немного неуклюжим, поэтому я изменил его на:

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

#define MAX_WORDS 100

int main(void) {
    char *buffer, *words[MAX_WORDS], *aPtr;
    int count = 0, i;

    buffer = strdup("The quick brown fox jumps over the lazy dog");
    if (!buffer) return 1;

    while((aPtr = strsep(&buffer, " ")) && count < MAX_WORDS)
        words[count++] = aPtr;

    for (i = 0; i < count; i++) {
        printf("%s\n", words[i]);   
    }
    return 0;
}

вывод такой же.

1 голос
/ 26 мая 2009

Вам нужен динамически распределенный массив. Вы можете бросить свой собственный, но почему бы не использовать Seq_T из C Дейва Хэнсона Интерфейсы и Реализации ? Функция Seq_addhi будет делать именно то, что вы хотите.

1 голос
/ 26 мая 2009

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

Я не вижу проблемы со strdup, но вы должны отказаться от strsep, у функции нет хорошего API. Практически проще сделать то, что делает strsep.

...