How to split a string to 2 strings in C

前端 未结 8 551
猫巷女王i
猫巷女王i 2020-11-28 04:29

I was wondering how you could take 1 string, split it into 2 with a delimiter, such as space, and assign the 2 parts to 2 separate strings. I\'ve tried using strtok()

相关标签:
8条回答
  • 2020-11-28 05:08

    This is how you implement a strtok() like function (taken from a BSD licensed string processing library for C, called zString).

    Below function differs from the standard strtok() in the way it recognizes consecutive delimiters, whereas the standard strtok() does not.

    char *zstring_strtok(char *str, const char *delim) {
        static char *static_str=0;      /* var to store last address */
        int index=0, strlength=0;       /* integers for indexes */
        int found = 0;                  /* check if delim is found */
    
        /* delimiter cannot be NULL
        * if no more char left, return NULL as well
        */
        if (delim==0 || (str == 0 && static_str == 0))
            return 0;
    
        if (str == 0)
            str = static_str;
    
        /* get length of string */
        while(str[strlength])
            strlength++;
    
        /* find the first occurance of delim */
        for (index=0;index<strlength;index++)
            if (str[index]==delim[0]) {
                found=1;
                break;
            }
    
        /* if delim is not contained in str, return str */
        if (!found) {
            static_str = 0;
            return str;
        }
    
        /* check for consecutive delimiters
        *if first char is delim, return delim
        */
        if (str[0]==delim[0]) {
            static_str = (str + 1);
            return (char *)delim;
        }
    
        /* terminate the string
        * this assignmetn requires char[], so str has to
        * be char[] rather than *char
        */
        str[index] = '\0';
    
        /* save the rest of the string */
        if ((str + index + 1)!=0)
            static_str = (str + index + 1);
        else
            static_str = 0;
    
            return str;
    }
    

    Below is an example code that demonstrates the usage

      Example Usage
          char str[] = "A,B,,,C";
          printf("1 %s\n",zstring_strtok(s,","));
          printf("2 %s\n",zstring_strtok(NULL,","));
          printf("3 %s\n",zstring_strtok(NULL,","));
          printf("4 %s\n",zstring_strtok(NULL,","));
          printf("5 %s\n",zstring_strtok(NULL,","));
          printf("6 %s\n",zstring_strtok(NULL,","));
    
      Example Output
          1 A
          2 B
          3 ,
          4 ,
          5 C
          6 (null)
    

    You can even use a while loop (standard library's strtok() would give the same result here)

    char s[]="some text here;
    do {
        printf("%s\n",zstring_strtok(s," "));
    } while(zstring_strtok(NULL," "));
    
    0 讨论(0)
  • 2020-11-28 05:15
    #include <string.h>
    
    char *token;
    char line[] = "SEVERAL WORDS";
    char *search = " ";
    
    
    // Token will point to "SEVERAL".
    token = strtok(line, search);
    
    
    // Token will point to "WORDS".
    token = strtok(NULL, search);
    

    Update

    Note that on some operating systems, strtok man page mentions:

    This interface is obsoleted by strsep(3).

    An example with strsep is shown below:

    char* token;
    char* string;
    char* tofree;
    
    string = strdup("abc,def,ghi");
    
    if (string != NULL) {
    
      tofree = string;
    
      while ((token = strsep(&string, ",")) != NULL)
      {
        printf("%s\n", token);
      }
    
      free(tofree);
    }
    
    0 讨论(0)
  • 2020-11-28 05:20

    For purposes such as this, I tend to use strtok_r() instead of strtok().

    For example ...

    int main (void) {
    char str[128];
    char *ptr;
    
    strcpy (str, "123456 789asdf");
    strtok_r (str, " ", &ptr);
    
    printf ("'%s'  '%s'\n", str, ptr);
    return 0;
    }
    

    This will output ...

    '123456' '789asdf'

    If more delimiters are needed, then loop.

    Hope this helps.

    0 讨论(0)
  • 2020-11-28 05:21

    You can do:

    char str[] ="Stackoverflow Serverfault";
    char piece1[20] = ""
        ,piece2[20] = "";
    char * p;
    
    p = strtok (str," "); // call the strtok with str as 1st arg for the 1st time.
    if (p != NULL) // check if we got a token.
    {
        strcpy(piece1,p); // save the token.
        p = strtok (NULL, " "); // subsequent call should have NULL as 1st arg.
        if (p != NULL) // check if we got a token.
            strcpy(piece2,p); // save the token.
    }
    printf("%s :: %s\n",piece1,piece2); // prints Stackoverflow :: Serverfault
    

    If you expect more than one token its better to call the 2nd and subsequent calls to strtok in a while loop until the return value of strtok becomes NULL.

    0 讨论(0)
  • 2020-11-28 05:23
    char *line = strdup("user name"); // don't do char *line = "user name"; see Note
    
    char *first_part = strtok(line, " "); //first_part points to "user"
    char *sec_part = strtok(NULL, " ");   //sec_part points to "name"
    

    Note: strtok modifies the string, so don't hand it a pointer to string literal.

    0 讨论(0)
  • 2020-11-28 05:29

    You can use strtok() for that Example: it works for me

    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {
        char str[] ="- This, a sample string.";
        char * pch;
        printf ("Splitting string \"%s\" into tokens:\n",str);
        pch = strtok (str," ,.-");
        while (pch != NULL)
        {
            printf ("%s\n",pch);
            pch = strtok (NULL, " ,.-");
        }
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题