c - манипулирование строкой для структурирования члена - PullRequest
3 голосов
/ 17 ноября 2010

Исходя из моего предыдущего поста, я придумал следующий код.Я уверен, что есть лучший способ сделать это.Мне интересно, что бы это было?

Разбивает строку, если число символов больше максимального OR, если @ найденоБудем благодарны за любые идеи

1 Ответ

1 голос
/ 17 ноября 2010

Хорошо, я попробую. Во-первых, позвольте мне сказать, что мои изменения форматирования были для меня. Если тебе не нравится одинокий, то это нормально.

#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 для отдельных строковых буферов. Это позволяет заранее не знать длину входной строки за счет нескольких дополнительных выделений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...