我试图在Java中编写类似于split
的C函数。当我做我在main做的事情,而不是添加功能,它完美地工作。但我无法理解为什么它不适用于添加功能。
#include <stdio.h>
#include <string.h>
char *words[50] = { NULL };
void add(const char *word) {
static int i = 0;
words[i] = word;
i++;
}
int main( void )
{
char string[65];
char *tokenPtr;
fgets(string, 65, stdin);
tokenPtr = strtok( string, " " );
add(tokenPtr);
int i = 0;
while ( tokenPtr != NULL ) {
add(tokenPtr);
tokenPtr = strtok( NULL, " " );
}
int i;
for(i = 0; words[i] != NULL; i++)
puts(words[i]);
return 0;
}
这只是我实际代码的一小部分,我需要在另一个函数中执行此操作。
答案 0 :(得分:4)
删除第一个add
来电。
fgets(string, 65, stdin);
tokenPtr = strtok( string, " " );
// add(tokenPtr); // remove
因为您将在下一个while
循环中添加第一个标记。
此外,您应删除int i
的重复。
// int i; // <-- why is it there?
for(i = 0; words[i] != NULL; i++)
puts(words[i]);
答案 1 :(得分:1)
除了删除对add
的第一次调用以及i
的重复声明之外,还有其他一些注意事项。虽然使用while
解析令牌没有任何问题,特别是strtok
,for
循环可以很好地处理初始调用以及每次后续调用NULL
。
同样,虽然static
中i
的{{1}}声明没有任何问题,但将索引作为参数传递给函数可以提供对{{1}中的计数的访问权限}}。如果您以后决定动态分配/重新分配add
,这会增加一定数量的令牌以及灵活性。
虽然使用main()
循环在依赖指针的words
测试时无限期迭代没有任何问题,但是如果您确实将令牌索引作为参数传递给for
,你可以迭代确定的范围NULL
,并确保在你拥有add
令牌的情况下,你不会尝试超越0 < i < token index
的结尾。 (可以添加测试)
最后,(这只是一个例子),当声明变量用作正计数器,索引等时,请考虑使用words
而不是49
。
这个问题有很多方法,没有人比另一个更正确,只要正确。考虑到所有因素,对代码的略微修改可能如下所示:
size_t
<强>输出强>
int