在C中使用strsep()和动态字符串数组

时间:2009-05-26 02:55:40

标签: c arrays string pointers

我有以下代码:

#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 个答案:

答案 0 :(得分:2)

至今尚未分配words[0]words[1],...因此使用strdup无效。

更糟糕的是,你事先并不知道会有多少单词,所以malloc你需要的空间并不容易。

一种选择是用链表或动态数组替换words

答案 1 :(得分:2)

您需要为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 :(得分:2)

如果只是为了尝试它,你可能会使用简单的东西:

#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 $ 

答案 3 :(得分:1)

你的第一个问题是你需要一个单词列表 - 你可以通过对单词中的一些限制进行硬编码(一个N个单词的数组,每个单词都是一个地址)来逃避,但这并不是真正的生产质量。真正的解决方案是拥有一个列表(可以在内部实现增长数组)

我没有看到strdup的问题,但你应该使strsep无效,该函数没有一个好的API。用手做什么几乎更容易做到。

答案 4 :(得分:1)

您需要一个动态分配的数组。你可以自己动手,但为什么不使用Dave Hanson C Interfaces and ImplementationsSeq_TSeq_addhi函数将完全按照您的意愿执行。

答案 5 :(得分:1)

上面的循环有点笨拙,所以我把它改成了:

#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;
}

输出相同。