Хорошо, я попробую. Во-первых, позвольте мне сказать, что мои изменения форматирования были для меня. Если тебе не нравится одинокий, то это нормально.
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 5
struct string_bin
{
char *str;
};
int main ()
{
struct string_bin *strings;
char *tmp = "Hello World@Foo Bar In here@Bar Foo dot com@here@there";
char *p = tmp;
strings = malloc (20 * sizeof (struct string_bin));
memset(strings, 0, 20 * sizeof (struct string_bin));
int strIdx = 0, offset = 0;
char *cursor, *save;
strings[strIdx].str = malloc(MAX+1);
save = strings[strIdx].str;
while (*p != '\0')
{
if (offset < MAX && *p != '@')
{
*(save++) = *(p++);
offset++;
continue;
}
else if (*p == '@')
*p++;
offset = 0;
*save = '\0';
strings[++strIdx].str = malloc(MAX+1);
save = strings[strIdx].str;
}
*save = '\0';
for (strIdx = 0; strings[strIdx].str != NULL; strIdx++)
{
printf ("%s\n", strings[strIdx].str);
free (strings[strIdx].str);
}
free (strings);
return 0;
}
Большое изменение в том, что я избавился от ваших strdup
звонков. Вместо этого я вставил строку прямо в целевой буфер. Я также сделал больше вызовов malloc
для отдельных строковых буферов. Это позволяет заранее не знать длину входной строки за счет нескольких дополнительных выделений.