Split string into Tokens in C, when there are 2 delimiters in a row

前端 未结 1 1588
情书的邮戳
情书的邮戳 2021-01-15 01:58

I am using strtok() function to split a string into Tokens.The problem is when there are 2 delimiters in row.

/* strtok example */
#include 
#         


        
相关标签:
1条回答
  • 2021-01-15 02:44

    strtok() does explicitly the opposite of what you want.

    Found in an online manual:

    A sequence of two or more contiguous delimiter bytes in the parsed string is considered to be a single delimiter. Delimiter bytes at the start or end of the string are ignored. Put another way: the tokens returned by strtok() are always nonempty strings.

    strtok(3) - Linux man page

    I implemented strtoke() - a variant of strtok() which behaves similar but does what you want:

    /* strtoke example */
    #include <stdio.h>
    #include <string.h>
    
    /* behaves like strtok() except that it returns empty tokens also
     */
    char* strtoke(char *str, const char *delim)
    {
      static char *start = NULL; /* stores string str for consecutive calls */
      char *token = NULL; /* found token */
      /* assign new start in case */
      if (str) start = str;
      /* check whether text to parse left */
      if (!start) return NULL;
      /* remember current start as found token */
      token = start;
      /* find next occurrence of delim */
      start = strpbrk(start, delim);
      /* replace delim with terminator and move start to follower */
      if (start) *start++ = '\0';
      /* done */
      return token;
    }
    
    int main ()
    {
      char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,";
      char * pch;
      printf ("Splitting string \"%s\" into tokens:\n",str);
      pch = strtoke(str,", ");
      while (pch != NULL)
      {
        printf ("Token = %s\n",pch);
        pch = strtoke(NULL, ", ");
      }
      return 0;
    }
    

    Compiled and tested with gcc on cygwin:

    $ gcc -o test-strtok test-strtok.c
    
    $ ./test-strtok.exe 
    Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens:
    Token = Test=
    Token = 0.28
    Token = 0.0
    Token = 1
    Token = 
    Token = 1.9
    Token = 2.2
    Token = 1.0
    Token = 
    Token = 8
    Token = 4
    Token = 
    Token = 
    Token = 42
    Token = 
    Token = 
    

    Another cite from the above link:

    Be cautious when using these functions. If you do use them, note that:

    • These functions modify their first argument.
    • These functions cannot be used on constant strings.
    • The identity of the delimiting byte is lost.
    • The strtok() function uses a static buffer while parsing, so it's not thread safe. Use strtok_r() if this matters to you.

    These issues apply to my strtoke() also.

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