C split a char array into different variables

后端 未结 7 965
不思量自难忘°
不思量自难忘° 2020-12-03 08:31

In C how can I separate a char array by a delimiter? Or is it better to manipulate a string? What are some good C char manipulation functions?

相关标签:
7条回答
  • 2020-12-03 08:45

    You could simply replace the separator characters by NULL characters, and store the address after the newly created NULL character in a new char* pointer:

    char* input = "asdf|qwer"
    char* parts[10];
    int partcount = 0;
    
    parts[partcount++] = input;
    
    char* ptr = input;
    while(*ptr) { //check if the string is over
        if(*ptr == '|') {
            *ptr = 0;
            parts[partcount++] = ptr + 1;
        }
        ptr++;
    }
    

    Note that this code will of course not work if the input string contains more than 9 separator characters.

    0 讨论(0)
  • 2020-12-03 08:52

    Look at strtok(). strtok() is not a re-entrant function.

    strtok_r() is the re-entrant version of strtok(). Here's an example program from the manual:

       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
    
       int main(int argc, char *argv[])
       {
           char *str1, *str2, *token, *subtoken;
           char *saveptr1, *saveptr2;
           int j;
    
           if (argc != 4) {
               fprintf(stderr, "Usage: %s string delim subdelim\n",argv[0]);
               exit(EXIT_FAILURE);
           }
    
           for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
               token = strtok_r(str1, argv[2], &saveptr1);
               if (token == NULL)
                   break;
               printf("%d: %s\n", j, token);
    
               for (str2 = token; ; str2 = NULL) {
                   subtoken = strtok_r(str2, argv[3], &saveptr2);
                   if (subtoken == NULL)
                       break;
                   printf(" --> %s\n", subtoken);
               }
           }
    
           exit(EXIT_SUCCESS);
       }
    

    Sample run which operates on subtokens which was obtained from the previous token based on a different delimiter:

    $ ./a.out hello:word:bye=abc:def:ghi = :
    
    1: hello:word:bye
     --> hello
     --> word
     --> bye
    2: abc:def:ghi
     --> abc
     --> def
     --> ghi
    
    0 讨论(0)
  • 2020-12-03 08:55

    In addition, you can use sscanf for some very simple scenarios, for example when you know exactly how many parts the string has and what it consists of. You can also parse the arguments on the fly. Do not use it for user inputs because the function will not report conversion errors.

    Example:

    char text[] = "1:22:300:4444:-5";
    int i1, i2, i3, i4, i5;
    sscanf(text, "%d:%d:%d:%d:%d", &i1, &i2, &i3, &i4, &i5);
    printf("%d, %d, %d, %d, %d", i1, i2, i3, i4, i5);
    

    Output:

    1, 22, 300, 4444, -5

    For anything more advanced, strtok() and strtok_r() are your best options, as mentioned in other answers.

    0 讨论(0)
  • 2020-12-03 08:58

    I came up with this.This seems to work best for me.It converts a string of number and splits it into array of integer:

    void splitInput(int arr[], int sizeArr, char num[])
    {
        for(int i = 0; i < sizeArr; i++)
            // We are subtracting 48 because the numbers in ASCII starts at 48.
            arr[i] = (int)num[i] - 48;
    }
    
    0 讨论(0)
  • 2020-12-03 09:03
    #include<string.h>
    #include<stdio.h>
    int main()
    {
        char input[16] = "abc,d";
        char *p;
        p = strtok(input, ",");
    
        if(p)
        {
        printf("%s\n", p);
        }
        p = strtok(NULL, ",");
    
        if(p)
               printf("%s\n", p);
        return 0;
    }
    

    you can look this program .First you should use the strtok(input, ",").input is the string you want to spilt.Then you use the strtok(NULL, ","). If the return value is true ,you can print the other group.

    0 讨论(0)
  • 2020-12-03 09:03

    This is how I do it.

    void SplitBufferToArray(char *buffer, char * delim, char ** Output) {
    
        int partcount = 0;
        Output[partcount++] = buffer;
    
        char* ptr = buffer;
        while (ptr != 0) { //check if the string is over
            ptr = strstr(ptr, delim);
            if (ptr != NULL) {
                *ptr = 0;
                Output[partcount++] = ptr + strlen(delim);
                ptr = ptr + strlen(delim);
            }
    
        }
        Output[partcount++] = NULL;
    }
    
    0 讨论(0)
提交回复
热议问题