metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-04-22 06:05 pm

C, parse comma-separated line

Кошерен ли такой код для разбиения строки, разделенной запятыми на отдельные строки: http://ideone.com/rhNXq ?

PS: strtok не признаю по идеологическим причинам - она меняет анализируемую строку, что меня крайне пугает, хотя в моем конкретном случае это не мешает.

PPS: безотносительно к strtok, в функции было минимум две ошибки - отсутствие проверки на выход за пределы буфера и попадание eol в последнюю строку (девайсина, с которой приходит строка, терминирует ее \r)

[identity profile] metaclass.livejournal.com 2012-04-22 08:39 pm (UTC)(link)
Не, не, мы уж как нибудь на clojure да F#, с PHP связываться не желаю.

[identity profile] slonik-v-domene.livejournal.com 2012-04-22 08:42 pm (UTC)(link)
Вам, как юэ так культурно сказать, чтобы не обидеть... Вам немного рано проектировать код на C.
В функции решительно неправильно все, начиная от сигнатуры, продолжая возвращаемыми значениями и заканчивая реализацией.

Я бы проголосовал убить это кадавра, неудовлетворенного полностью.

[identity profile] metaclass.livejournal.com 2012-04-22 08:46 pm (UTC)(link)
Меня мой код тоже не устраивает, т.к. я пока не вижу, как идеологически верно его оформлять.
Приводите примеры, как правильно :)

[identity profile] slonik-v-domene.livejournal.com 2012-04-22 09:02 pm (UTC)(link)
Я не знаю всех условий задачи. Если надо найти первое вхождение ',' и при этом не заморачиваться вопросами экранирования символа внутри строк " ... " и ' ... ', это делается примерно так:
int parse(const char * source_start, const char * const source_end, const char ** dest, size_t * dest_len)
{
        if (source_start == NULL || source_end < source_start) { return -1; }

        *dest = source_start;
        while (source_start < source_end)
        {
                if (*source_start == ',') { break; }
                source_start++;
        }

        *dest_len = source_start - *dest;

return 0;
}

Впрочем, я код не проверял и набросал его прямо здесь.
Edited 2012-04-22 21:05 (UTC)

[identity profile] metaclass.livejournal.com 2012-04-22 09:12 pm (UTC)(link)
У меня там не только первое вхождение, а перебирает все вхождения. Т.е.я специально source_start модифицирую.

Проверки параметров и выход из цикла, да, надо исправить.
А вот насчет возвращаемых значений - почему именно так: 0 и -1?
Я, когда писал, ориентировался на что-то вроде: 0 (false) - завершение работы, 1 (true) - продолжение.
Стандартные же true и false вроде только в C99 появились.

[identity profile] slonik-v-domene.livejournal.com 2012-04-22 09:29 pm (UTC)(link)
1) Потому, что ожидаемое поведение -1 - ошибка, а 0 и больше - успех.
2) true и false не существуют до тех пор, пока не существует типа bool. Тот, кто указывает #define true .... - тот является клиническим мудаком.
3) если надо найти все последовательности, следует просто вызывать функцию в цикле