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] dair-spb.livejournal.com 2012-04-22 03:13 pm (UTC)(link)
Как предлагаешь парсить потенциальный гигабайт?

[identity profile] gds.livejournal.com 2012-04-22 03:14 pm (UTC)(link)
итератами, чо.

[identity profile] gds.livejournal.com 2012-04-22 03:15 pm (UTC)(link)
ну да, и не через strхуйню.

[identity profile] blacklion.livejournal.com 2012-04-22 03:15 pm (UTC)(link)
mmap()? :)
Решение топикстартера тоже особо на подкачку не рассчитано

[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] http://users.livejournal.com/_slw/ 2012-04-22 03:26 pm (UTC)(link)
use pcre, luck!

[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)
в С нет строк как таковых. есть последовательность символов.

[identity profile] artureg.livejournal.com 2012-04-22 03:51 pm (UTC)(link)
я знаю, это ужасно

[identity profile] theiced.livejournal.com 2012-04-22 03:52 pm (UTC)(link)
luke*

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

[identity profile] fas-tm.livejournal.com 2012-04-22 03:56 pm (UTC)(link)
fuck*
ближе по смыслу :)

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

[identity profile] avnik.livejournal.com 2012-04-22 04:07 pm (UTC)(link)
Кстати -- а куда бы посмотреть на предмет "загрузить большой файл с radix tree mmap'ом и поискать там чего"? (не в плане супер-реализации, а скорее чего попроще, чтобы понять как такое работает)

[identity profile] sorhed.livejournal.com 2012-04-22 04:14 pm (UTC)(link)
Вы так говорите, будто последовательность символов нельзя сплитить.

[identity profile] sorhed.livejournal.com 2012-04-22 04:18 pm (UTC)(link)
(ггг, тут был комент, в котором я был дебилом, извините).

[identity profile] theiced.livejournal.com 2012-04-22 04:35 pm (UTC)(link)
а например память оно зачем будет ТАК жратъ?

[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?

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

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

[personal profile] abbra 2012-04-22 04:43 pm (UTC)(link)
Knuth, Donald. E. [1998]. The Art of Computer Programming, Volume 3, Sorting and Searching. Addison-Wesley, Reading, Massachusetts.

Page 1 of 5