C - Determining which delimiter used - strtok()

前端 未结 3 1562
攒了一身酷
攒了一身酷 2021-02-14 08:05

Let\'s say I\'m using strtok() like this..

char *token = strtok(input, \";-/\");

Is there a way to figure out which token actually

相关标签:
3条回答
  • 2021-02-14 08:26

    man 3 strtok

    The strtok() and strtok_r() functions return a pointer to the beginning of each subsequent token in the string, after replacing the token itself with a NUL character. When no more tokens remain, a null pointer is returned.

    But with a little pointer arithmetic you can do something like:

    char* string = "Hello,World!";
    char* dup = strdup(string);
    
    char* world = strtok(string, ",");
    char delim_used = dup[world - string];
    
    free(dup);
    
    0 讨论(0)
  • 2021-02-14 08:29

    Important: strtok is not re-entrant, you should use strtok_r instead of it.

    You can do it by saving a copy of the original string, and looking into offsets of the current token into that copy:

    char str[] = "Hello there; How are you? / I'm good - End";
    char *copy = strdup(str);
    char *delim = ";-/";
    char *res = strtok( str, delim );
    while (res) {
        printf("%c\n", copy[res-str+strlen(res)]);
        res = strtok( NULL, delim );
    }
    free(copy);
    

    This prints

    ;
    /
    -
    

    Demo #1

    EDIT: Handling multiple delimiters

    If you need to handle multiple delimiters, determining the length of the current sequence of delimiters becomes slightly harder: now you need to find the next token before deciding how long is the sequence of delimiters. The math is not complicated, as long as you remember that NULL requires special treatment:

    char str[] = "(20*(5+(7*2)))+((2+8)*(3+6*9))";
    char *copy = strdup(str);
    char *delim = "*+()";
    char *res = strtok( str, delim );
    while (res) {
        int from = res-str+strlen(res);
        res = strtok( NULL, delim );
        int to = res != NULL ? res-str : strlen(copy);
        printf("%.*s\n", to-from, copy+from);
    }
    free(copy);
    

    Demo #2

    0 讨论(0)
  • 2021-02-14 08:42

    You can't. strtok overwrites the next separator character with a nul character (in order to terminate the token that it's returning this time), and it doesn't store the previous value that it overwrites. The first time you call strtok on your example string, the ; is gone forever.

    You could do something if you keep an unmodified copy of the string you're modifying with strtok - given the index of the nul terminator for your current token (relative to the start of the string), you can look at the same index in the copy and see what was there.

    That might be worse than just writing your own code to separate the string, of course. You can use strpbrk or strcspn, if you can live with the resulting token not being nul-terminated for you.

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