Проблема в линии data++
.Вы продвигаетесь вперед на один символ за раз, поэтому для вашей первой строки, aku:makan:ati
, вы проходите мимо a
, k
и u
до *data == k[0]
из-за :
, и анализ останавливается.Это случайно три хода, что приводит к анализу трех полей;aku
, makan
и ati
.
Вторая строка, 2:capede:eke:bo
, содержит только один символ, 2
, до того как вы достигнете :
, и синтаксический анализ прекращается.Поэтому разбирается только первое поле.Если вы измените строку на 22:capede:eke:bo
, вы увидите, что и 22
, и capede
анализируются.
Сначала вам нужно заменить data++
на что-то, что увеличиваетdata
указатель соответственно.Затем вы должны убедиться, что вы не выходите за пределы строки.
Чтобы все было намного проще, я бы предложил вам заменить функцию parse
на что-то вроде этого:
void parse(char *data, char split)
{
char format[8] = {0};
char token[256];
char *end = data + strlen(data);
sprintf(format, "%%[^%c]%c", split, split);
while (sscanf(data, format, &token) == 1 && data < end)
{
printf("%s\n", token);
data += strlen(token) + 1;
}
}