C - Determining which delimiter used - strtok()

前端 未结 3 1553
攒了一身酷
攒了一身酷 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: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

提交回复
热议问题