How does strtok() split the string into tokens in C?

前端 未结 15 1877
陌清茗
陌清茗 2020-11-22 14:48

Please explain to me the working of strtok() function. The manual says it breaks the string into tokens. I am unable to understand from the manual what it actua

相关标签:
15条回答
  • 2020-11-22 15:27

    strtok maintains a static, internal reference pointing to the next available token in the string; if you pass it a NULL pointer, it will work from that internal reference.

    This is the reason strtok isn't re-entrant; as soon as you pass it a new pointer, that old internal reference gets clobbered.

    0 讨论(0)
  • 2020-11-22 15:27

    strtok() stores the pointer in static variable where did you last time left off , so on its 2nd call , when we pass the null , strtok() gets the pointer from the static variable .

    If you provide the same string name , it again starts from beginning.

    Moreover strtok() is destructive i.e. it make changes to the orignal string. so make sure you always have a copy of orignal one.

    One more problem of using strtok() is that as it stores the address in static variables , in multithreaded programming calling strtok() more than once will cause an error. For this use strtok_r().

    0 讨论(0)
  • 2020-11-22 15:29

    the strtok runtime function works like this

    the first time you call strtok you provide a string that you want to tokenize

    char s[] = "this is a string";
    

    in the above string space seems to be a good delimiter between words so lets use that:

    char* p = strtok(s, " ");
    

    what happens now is that 's' is searched until the space character is found, the first token is returned ('this') and p points to that token (string)

    in order to get next token and to continue with the same string NULL is passed as first argument since strtok maintains a static pointer to your previous passed string:

    p = strtok(NULL," ");
    

    p now points to 'is'

    and so on until no more spaces can be found, then the last string is returned as the last token 'string'.

    more conveniently you could write it like this instead to print out all tokens:

    for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " "))
    {
      puts(p);
    }
    

    EDIT:

    If you want to store the returned values from strtok you need to copy the token to another buffer e.g. strdup(p); since the original string (pointed to by the static pointer inside strtok) is modified between iterations in order to return the token.

    0 讨论(0)
  • 2020-11-22 15:30

    For those who are still having hard time understanding this strtok() function, take a look at this pythontutor example, it is a great tool to visualize your C (or C++, Python ...) code.

    In case the link got broken, paste in:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char s[] = "Hello, my name is? Matthew! Hey.";
        char* p;
        for (char *p = strtok(s," ,?!."); p != NULL; p = strtok(NULL, " ,?!.")) {
          puts(p);
        }
        return 0;
    }
    

    Credits go to Anders K.

    0 讨论(0)
  • 2020-11-22 15:31

    you can scan the char array looking for the token if you found it just print new line else print the char.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char *s;
        s = malloc(1024 * sizeof(char));
        scanf("%[^\n]", s);
        s = realloc(s, strlen(s) + 1);
        int len = strlen(s);
        char delim =' ';
        for(int i = 0; i < len; i++) {
            if(s[i] == delim) {
                printf("\n");
            }
            else {
                printf("%c", s[i]);
            }
        }
        free(s);
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-22 15:32

    The first time you call it, you provide the string to tokenize to strtok. And then, to get the following tokens, you just give NULL to that function, as long as it returns a non NULL pointer.

    The strtok function records the string you first provided when you call it. (Which is really dangerous for multi-thread applications)

    0 讨论(0)
提交回复
热议问题