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] artureg.livejournal.com 2012-04-22 03:40 pm (UTC)(link)
а split в этой дремучести не определён?

[identity profile] smalgin.livejournal.com 2012-04-22 04:37 pm (UTC)(link)
Как уже предложили выше (lionet), используйте готовую библиотеку строк. Чем раньше вы начнете ее использовать, тем меньше времени потратите на переписывание потом.

Если вам нужно просто разобрать CSV, то и для разбора оного есть готовые библиотеки с хорошей историей.

В строках можно даже с добрыми намерениями нагородить 'one off' и buffer overruns (как вы показательно его вставили в первой же функции сверху)

Еще стандартный совет из сети - не использовать арифметику указателей без сильной нужды. operator[] and indexes do the same job just fine.

Будет весело, гарантирую.

[identity profile] blackyblack.livejournal.com 2012-04-22 05:38 pm (UTC)(link)
1. В коде косяки - работать не будет.
2. В идеале стоило бы разбить код на две функции: поиск символа в строке и разбиение строки по номеру символа.
3. \r в результате за ошибку не считаем. Откуда нам знать, что она тебе не нужна :)

В итоге, ждём исправленную версию.

[identity profile] plumqqz.livejournal.com 2012-04-22 08:23 pm (UTC)(link)
Интересно даже (я комментарии не читал пока), сколько раз предложили strtok_r?

[identity profile] slonik-v-domene.livejournal.com 2012-04-22 08:35 pm (UTC)(link)
Код кривой, аффтара - отлучить от C и перевести в программисты PHP.

[identity profile] esil0x.livejournal.com 2012-04-23 03:09 am (UTC)(link)
Вы всё продолжаете себя мучать? Первый и третий пункт рецепта как и в прошлом посте, меняется только второй:

#include <boost/tokenizer.hpp>
#include <iostream>

const std::string str("aaaa,ssdsd asdsd,ffffff");

int main() {
    typedef boost::tokenizer< boost::char_separator<char> > splitter;

    boost::char_separator<char> sep(",");
    splitter spl(str, sep);

    for (splitter::const_iterator it = spl.begin(), end = spl.end(); it != end; ++it) {
        std::cout << *it << "\n";
    }
}