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] blacklion.livejournal.com 2012-04-22 03:09 pm (UTC)(link)
man strsep strtok

[identity profile] metaclass.livejournal.com 2012-04-22 03:13 pm (UTC)(link)
Про них какие-то неприятные вещи в man написаны, меня идея модифицировать строку ради парсинга крайне пугает.

[identity profile] blacklion.livejournal.com 2012-04-22 03:17 pm (UTC)(link)
Есть ещё strcspn() и strspn() и strpbrk()
Edited 2012-04-22 15:18 (UTC)

[identity profile] dair-spb.livejournal.com 2012-04-22 03:13 pm (UTC)(link)
Как предлагаешь парсить потенциальный гигабайт?

(no subject)

[identity profile] gds.livejournal.com - 2012-04-22 15:14 (UTC) - Expand

(no subject)

[identity profile] gds.livejournal.com - 2012-04-22 15:15 (UTC) - Expand

(no subject)

[identity profile] blacklion.livejournal.com - 2012-04-22 15:15 (UTC) - Expand

(no subject)

[identity profile] avnik.livejournal.com - 2012-04-22 16:07 (UTC) - Expand

(no subject)

[personal profile] abbra - 2012-04-22 16:43 (UTC) - Expand

(no subject)

[identity profile] avnik.livejournal.com - 2012-04-22 17:13 (UTC) - Expand

(no subject)

[personal profile] abbra - 2012-04-22 19:11 (UTC) - Expand

[identity profile] w00dy.livejournal.com 2012-04-22 04:42 pm (UTC)(link)
strsep и strtok разруливают ситуацию с экранированием? Нет? Тогда в печку их.

(no subject)

[identity profile] blacklion.livejournal.com - 2012-04-22 16:44 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 16:51 (UTC) - Expand

(no subject)

[identity profile] blacklion.livejournal.com - 2012-04-22 17:24 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2012-04-22 17:28 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2012-04-22 16:58 (UTC) - Expand

(no subject)

[identity profile] blacklion.livejournal.com - 2012-04-22 17:24 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2012-04-22 17:27 (UTC) - Expand

(no subject)

[identity profile] fas-tm.livejournal.com - 2012-04-22 15:56 (UTC) - Expand

[identity profile] inhate.livejournal.com 2012-04-22 07:45 pm (UTC)(link)
Еще блин один...

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

Вышеприведенную цитату надо калёны железом на жопах студентов профильных факультетов выжигать.

[identity profile] slonik-v-domene.livejournal.com 2012-04-22 08:59 pm (UTC)(link)
Ваша идея - говно.

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-23 07:42 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-23 08:36 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-23 08:44 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-23 08:49 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-04-23 18:41 (UTC) - Expand

[identity profile] artureg.livejournal.com 2012-04-22 03:40 pm (UTC)(link)
а split в этой дремучести не определён?

[identity profile] fas-tm.livejournal.com 2012-04-22 03:47 pm (UTC)(link)
в С нет строк как таковых. есть последовательность символов.

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 15:51 (UTC) - Expand

(no subject)

[identity profile] sorhed.livejournal.com - 2012-04-22 16:14 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 18:16 (UTC) - Expand

[identity profile] theiced.livejournal.com 2012-04-22 03:52 pm (UTC)(link)
сплит? ты дурак?

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 18:10 (UTC) - Expand

[identity profile] metaclass.livejournal.com 2012-04-22 03:58 pm (UTC)(link)
А возвращать он что будет?:)

(no subject)

[identity profile] lionet.livejournal.com - 2012-04-22 16:18 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-04-22 16:35 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2012-04-22 16:47 (UTC) - Expand

(no subject)

[identity profile] lionet.livejournal.com - 2012-04-22 21:27 (UTC) - Expand

(no subject)

[identity profile] sorhed.livejournal.com - 2012-04-22 16:18 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 18:11 (UTC) - Expand

[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] metaclass.livejournal.com 2012-04-22 04:41 pm (UTC)(link)
А где там overrun?

(no subject)

[identity profile] smalgin.livejournal.com - 2012-04-22 16:58 (UTC) - Expand

[identity profile] metaclass.livejournal.com 2012-04-22 04:42 pm (UTC)(link)
Холерный вибрион, я ж не проверяю в цикле выход за пределы буфера.

(no subject)

[identity profile] smalgin.livejournal.com - 2012-04-22 17:31 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 17:46 (UTC) - Expand

(no subject)

[identity profile] smalgin.livejournal.com - 2012-04-22 17:58 (UTC) - Expand

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

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

[identity profile] metaclass.livejournal.com 2012-04-22 05:47 pm (UTC)(link)
Проблема в том, что работало. Пока я не стал использовать ее вывод для дальнейшего парсинга, и то при этом в первую очередь сломалось на \r в последней строке.

А зачем разбивать на две строки, по моему так понятнее?

(no subject)

[identity profile] blackyblack.livejournal.com - 2012-04-22 17:52 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 17:58 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 18:17 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 18:22 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 18:23 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 18:31 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 18:33 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 18:41 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 18:43 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 18:52 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 19:29 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-04-22 19:41 (UTC) - Expand

(no subject)

[identity profile] artureg.livejournal.com - 2012-04-22 19:42 (UTC) - Expand

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

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 20:38 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-22 20:40 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 20:45 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-22 20:47 (UTC) - Expand

(no subject)

[identity profile] jdevelop.livejournal.com - 2012-04-23 11:46 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-23 11:52 (UTC) - Expand

(no subject)

[identity profile] jdevelop.livejournal.com - 2012-04-23 11:55 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-23 12:11 (UTC) - Expand

(no subject)

[identity profile] jdevelop.livejournal.com - 2012-04-23 12:14 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-23 12:22 (UTC) - Expand

(no subject)

[identity profile] jdevelop.livejournal.com - 2012-04-23 12:25 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-23 12:31 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-23 12:11 (UTC) - Expand

(no subject)

[identity profile] jdevelop.livejournal.com - 2012-04-23 12:15 (UTC) - Expand

[identity profile] slonik-v-domene.livejournal.com 2012-04-22 08:39 pm (UTC)(link)
strtok_r здесь излишен

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-22 20:42 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2012-04-22 21:18 (UTC) - Expand

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

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

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 20:46 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-22 21:12 (UTC) - Expand

[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";
    }
}

[identity profile] metaclass.livejournal.com 2012-04-23 06:39 am (UTC)(link)
Да, надо будет С++ тоже попробовать, на следующей потусторонней задаче.

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-04-23 06:51 (UTC) - Expand