Это не совсем так, как вы описываете, но возможно нечто подобное.Более конкретно, последняя строка вашего примера char **list = (char **)buf;
не будет делать то, во что вы верите.char **list
означает, что элементы, на которые указывает * list, будут иметь тип char*
, но содержимое *buf
является символами.Следовательно, невозможно изменить одно на другое.
Вы должны понимать, что char **
- это просто указатель, он ничего не может содержать сам по себе.Но char **
может быть начальным адресом массива char *
, каждый char *
указывает на поле.
Вы должны будете выделить место для массива char *
, используя первый malloc (или вы также можете использовать статический массив char *
вместо char**
. Вам также нужно будет найти место для каждого отдельного поля, возможно, выполнив malloc для каждого поля и скопировав его из исходного буфера. Если начальный буферпосле прочтения остается нетронутым, также можно использовать его для сохранения имен полей, но если вы просто замените начальный ;
на \n
, вы пропустите завершающий символ конца строки 0, вы не сможетезамените один символ на два символа.
Ниже приведен упрощенный пример того, что можно сделать (удаленная часть malloc, поскольку она мало добавляет к примеру и делает ее бесполезно сложной, это другая история):
#include <stdio.h>
#include <string.h>
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]);
}