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

我有以下代码:

#include  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()函数本身似乎不起作用……如果没有,我怎样才能使这段代码工作?

指针指针对我来说很头疼……

你还没有分配words[0]words[1] ,…所以使用strdup并没有帮助。

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

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

您需要为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 ); } 

或者更好 – 使用动态数据结构,如单链表。

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

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

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

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

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

上面的循环有点笨拙,所以我改为:

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

输出是一样的。