c splitting a char* into an char**

后端 未结 4 896
孤城傲影
孤城傲影 2021-01-22 09:20

I\'m reading in a line from a file (char by char, using fgetc()), where all fields(firstname, lastname, ...) are seperated by an ;. What I now want to do is create

4条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-22 09:21

    It's not exactly possible as you describe it, but something similar is possible. More specifically, the last line of your example char **list = (char **)buf; won't do what you believe. char **list means items pointed by *list will be of the type char*, but the content of *buf are chars. Hence it won't be possible to change one into another.

    You should understand that a char ** is just a pointer, it can hold nothing by itself. But the char ** can be the start address of an array of char *, each char * pointing to a field.

    You will have to allocate space for the char * array using a first malloc (or you also can use a static array of char * instead of a char**. You also will have to find space for every individual field, probably performing a malloc for each field and copying it from the initial buffer. If the initial buffer is untouched after reading, it would also be possible to use it to keep the field names, but if you just replace the initial ; by a \n, you'll be missing the trailing 0 string terminator, you can't replace inplace one char by two char.

    Below is a simplified example of what can be done (removed malloc part as it does not add much to the example, and makes it uselessly complex, that's another story):

    #include 
    #include 
    
    main(){
        // let's define a buffer with space enough for 100 chars
        // no need to perform dynamic allocation for a small example like this
        char buf[100];
        const char * data = "one;two;three;four;";
    
        // now we want an array of pointer to fields, 
        // here again we use a static buffer for simplicity,
        // instead of a char** with a malloc
        char * fields[10];
        int nbfields = 0;
        int i = 0;
        char * start_of_field;
    
        // let's initialize buf with some data, 
        // a semi-colon terminated list of strings 
        strcpy(buf, data);
    
        start_of_field = buf;
        // seek end of each field and
        // copy addresses of field to fields (array of char*)
        for (i = 0; buf[i] != 0; i++){
            if (buf[i] == ';'){
                buf[i] = 0;
                fields[nbfields] = start_of_field;
                nbfields++;
                start_of_field = buf+i+1;
            }
        }
    
        // Now I can address fields individually
        printf("total number of fields = %d\n"
               "third field is = \"%s\"\n",
               nbfields, fields[2]);
    }
    

提交回复
热议问题