我有以下代码:
#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()函数本身似乎不起作用......如果没有,我怎样才能使这段代码工作?
指针指针对我来说很头疼......
答案 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 Implementations的Seq_T
? Seq_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;
}
输出相同。