metaclass: (Default)
[personal profile] metaclass
Кошерен ли такой код для разбиения строки, разделенной запятыми на отдельные строки: http://ideone.com/rhNXq ?

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

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

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

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

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

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

Date: 2012-04-22 09:02 pm (UTC)
From: [identity profile] slonik-v-domene.livejournal.com
Я не знаю всех условий задачи. Если надо найти первое вхождение ',' и при этом не заморачиваться вопросами экранирования символа внутри строк " ... " и ' ... ', это делается примерно так:
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 Date: 2012-04-22 09:05 pm (UTC)

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

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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 28th, 2025 11:44 am
Powered by Dreamwidth Studios