【发布时间】:2015-03-21 00:20:22
【问题描述】:
我正在尝试编写一个类似于 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;
}
这只是我实际代码的一小部分,有一些原因我需要在另一个函数中这样做。
【问题讨论】:
-
我会删除对
add的第一次调用,因为它会重复第一个单词。还有其他问题吗?如果是这样,您应该描述您遇到的问题。 -
@BinaryJudy
i是静态变量,所以初始化一次,不重复。 -
我认为
add函数没有理由。删除它会使程序更好。 -
@ikh 哎呀,你是对的。我看着“静态”。
i将递增。 -
1) int i 在 main 中的多重定义。 2) 由于调用 fgets 后第二行无关紧要,第一个令牌被添加了两次。同样有趣的是,幻数 '65' 应该是 #define'd 并且 fgets 第二个参数应该是 #define 名称或 sizeof 字符串。虽然当前代码永远不会溢出 words[] 数组,但这可能会随着代码的变化而发生。所以 add 函数应该检查这种可能性
标签: c arrays pointers split strtok