在C中实现拆分功能

时间:2015-03-21 00:20:22

标签: c arrays pointers split strtok

我试图在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; 
} 

这只是我实际代码的一小部分,我需要在另一个函数中执行此操作。

2 个答案:

答案 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解析令牌没有任何问题,特别是strtokfor循环可以很好地处理初始调用以及每次后续调用NULL

同样,虽然statici的{​​{1}}声明没有任何问题,但将索引作为参数传递给函数可以提供对{{1}中的计数的访问权限}}。如果您以后决定动态分配/重新分配add,这会增加一定数量的令牌以及灵活性。

虽然使用main()循环在依赖指针的words测试时无限期迭代没有任何问题,但是如果您确实将令牌索引作为参数传递给for ,你可以迭代确定的范围NULL,并确保在你拥有add令牌的情况下,你不会尝试超越0 < i < token index的结尾。 (可以添加测试)

最后,(这只是一个例子),当声明变量用作正计数器,索引等时,请考虑使用words而不是49

这个问题有很多方法,没有人比另一个更正确,只要正确。考虑到所有因素,对代码的略微修改可能如下所示:

size_t

<强>输出

int