清洁实施strtok

时间:2013-02-08 16:05:05

标签: 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
    {
        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是正确的方法。

2 个答案:

答案 0 :(得分:2)

如果您的字符串是按照您的免费建议进行的。然后你不需要将它复制到一个新的缓冲区(btw 1个字符太短)。使用您提供的缓冲区。

如果const char *给你,你只需要复制它,即你不允许修改缓冲区的内容。

使用strtok_r也更好,因为常规strtok不可重入。

答案 1 :(得分:0)

您可以使用scanf()代替getstr()strtok()

char word[100];
while(scanf(" %s",word)!=EOF) {
    // use the word string here
}

用户应使用

停止输入字符
  • EOF = CTRL + D (对于Linux)

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