C strtok的更清洁实现

C strtok的更清洁实现,c,string,delimiter,strtok,C,String,Delimiter,Strtok,只是为了好玩,我写了一个程序,将采取一个用户输入的字符串(甚至可能是一个文本文档)和混乱的字符串中的字 我试图使用strtok函数来分隔字符串中的每个单词。目前,我觉得我当前对strtok的实现是草率的: int main(int argc, char *argv[]) { char *string, *word; if(!(string = getstr())) //function I wrote to retrieve a string {

只是为了好玩,我写了一个程序,将采取一个用户输入的字符串(甚至可能是一个文本文档)和混乱的字符串中的字

我试图使用
strtok
函数来分隔字符串中的每个单词。目前,我觉得我当前对strtok的实现是草率的:

int main(int argc, char *argv[])
{
    char *string, *word;

    if(!(string = getstr()))        //function I wrote to retrieve a string
    {
        fputs("Error.\n", stderr);
        exit(1);
    }
    char array[strlen(string) + 1];     //declare an array sized to the length of the string
    strcpy(array, string);          //copy the string into the array
    free(string);
    if(word = strtok(array, " "))
    {
        //later I'll just write each word into a matrix, not important right now.
        while(word = strtok(NULL, " "))
        {
        //later I'll just write each word into a matrix, not important right now.
        }
    }
    return 0;
}
我觉得必须有一种更干净的方法来实现strtok
strtok
,而不必在程序中途声明数组。我就是觉得不对。使用strtok是正确的方法吗?我不想使用固定大小的数组,因为我喜欢所有的东西都是动态的,这就是为什么我开始怀疑使用
strok
是否正确。

你可以使用
scanf()
而不是
getstr()
strok()

用户应使用以下命令停止输入字符:

  • EOF=CTRL+D(对于Linux)

  • EOF=CTRL+Z(适用于Windows)


如果您的字符串按照您的免费软件建议进行了malloced。然后,您不需要将其复制到新的缓冲区中(顺便说一句,1个字符太短)。使用提供的缓冲区

如果它是由
const char*
提供给您的,您只需要复制它,即不允许您修改缓冲区的内容


最好使用
strtok\u r
,因为常规的
strtok
是不可重入的。

free(string)为什么?我没有看到任何
malloc
,是否
getstr()
动态分配内存?
char数组[strlen(string)]
需要
字符数组[strlen(string)+1]
@AlokSave
getstr()
会动态分配内存@保罗:我刚刚更新了,谢谢。顺便说一句,是术语问题。你不是在“实现”
strtok
,你是在“调用”它。@SteveJessop,我也被这个问题弄糊涂了。抱歉,为了更清楚起见,我编辑了我的问题,我试图动态地这样做,我不想使用
scanf
“最好将strtok\r用作常规strtok,而不是可重入的。”+1用于此评论。我想知道OP是想实现“真正的”strtok,并包含它的所有缺点(主要是不可重入的),还是想实现一个更好的strtok。
char word[100];
while(scanf(" %s",word)!=EOF) {
    // use the word string here
}