LINUX.ORG.RU

Правильный(???) стиль работы со строковыми данными на С

 ,


2

4

Иногда (прямо сейчас) приходится обрабатыавть строки на C.
Меня коробит от громоздкости операций выделения памяти, конкатенации и самое главное это snprintf с проблемой размера буфера под конечную строку, гигантское поле для выращивания вских мемориликов по невнимательности.

К примеру, размеры mult1_str, mult2_str и equal_str известны, нужно выделить память под всю строку:

snprintf(
    buf,
    buflen,
    "%s miltilple %s equals %s",
    mult1_str,
    mult2_str,
    equal_str
    );
варианты:
- махнуть шашкой и сделать килобайт на стеке ( ((( )
- ничем не размахивать и посчитать руками. (еще хуже)
- написать функцию которая будет вычислять длину «%s miltilple %s equals %s» без символов подстановки (уже лучше)
- отказаться от snprintf и собирать строку пачкой конкатенаций с аллокациями памяти и прочим...

А как делаешь ты?


ngx_str_t. Есть базовый API, работает с аллокаторами. Быстро, надежно, удобно (по-сишному).

anonymous
()
Ответ на: комментарий от RazrFalcon

Это мне может мешать? Ты вот не писатель (вероятно), но пишешь текст. Для того что бы обсуждать что-то не обязательно иметь для этого призвание или специальность. Также можно о готовке мяса спорить и не быть поваром.

Deleted
()
Ответ на: комментарий от slovazap

Я беру C++, а если мне кто-то говорит что нужно использовать C плюю ему в рожу, пишу докладную его непосредственному руководителю, а если надо по цепочке выше о профнепригодности и беру C++.

ты точно программируешь и имеешь в виду яп?
за меморилик у вас наверное и на бутылку посадят

ocr
() автор топика
Ответ на: комментарий от Deleted

Это мне может мешать?

Да. Вы не разбираетесь в предмете, но мнение имеете.

Также можно о готовке мяса спорить и не быть поваром.

Если спорите не с поваром - то пожалуйста.

RazrFalcon ★★★★★
()
Ответ на: комментарий от byko3y

Возврат пустой строки? Под ноль память выделили, но не инициализировали.

Подсказка: он в строке

           size++;             /* For '\0' */

Вот лишнюю проверку что-то не нахожу. Или неужто vsnprintf не может вернуть ошибку, если первый раз выдало успех?

Именно. Это бы означало, что кто-то изменил форматную строку либо данные для неё, что есть UB.

shdown
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от Deleted

Ну в реальном мире оказалось что человек последние полгода занимался в основном тем что правил свои же баги, поэтому уволили так человека и на C писать перестали. Но ты можешь мечтать как увольняют только за мысли о нормальный ЯП.

slovazap ★★★★★
()
Ответ на: комментарий от RazrFalcon

Если спорите не с поваром - то пожалуйста.

Спасибо, только вот повар не делает правильно, правильного способа готовки мяса не существует в принципе и спорить с ним можно, ты понял суть то?

Да. Вы не разбираетесь в предмете, но мнение имеете.

Странная логика, я предметом пользуюсь, часто и активно и имею вполне себе конкретное мнение. Вот то что уровень не высок, это да. Но, смотря с какой колокольни смотреть. Тоже самое можно сказать про тебя. Так что всё нормально.

Думать о разном, заниматься разным и для всего иметь «свой» взгляд и мысли это нормально. Если для тебя это не так то ты странный.

Deleted
()
Ответ на: комментарий от slovazap

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

ocr
() автор топика
Ответ на: комментарий от slovazap

Ну, так там дело в человеке. Если полгода рефракторил самого себя. Так на любом языке можно. Ну если вы перестали писать на С в этом нет ничего плохого, значит выбрали иные технологии в чём проблема. Под каждую задачу желательно выбирать наиболее подходящее и то без фанатизма, а то проект 1, а рабочих языков 63 и на каждый пук прогрессивный фремворк/либа. Ну ты понял. Это я могу писать на том что мне просто нравится и более общно. Сишка покрывает широкий круг задач для меня в том и фишка. Да, порой видно что какую то отдельную вещь удобнее/быстрее и проще сделать на ином, но у меня написать лишнюю функцию для себя боли не вызывает и всё у меня в одних рамках и мне норм. Вот поэтому я и не понимаю твоего бугурта. И да нормальных языков не бывает, они просто все разные. Эх, ладно.

Deleted
()
Ответ на: комментарий от slovazap

Ну в реальном мире оказалось что человек последние полгода занимался в основном тем что правил свои же баги, поэтому уволили так человека и на C писать перестали.

Полное отсутствие какой-либо логики в поведении начальства ) Тут вообще-то «начальство» надо увольнять, если смена языка проекта определяется просто тем, что какой-то конкретный чувак взялся не за свое дело. Да, грамотно и надёжно писать на C может далеко не каждый - но это не недостаток языка. Ну просто способности у людей разные... И, соответственно, не каждого встречного-поперечного нужно сажать на задачи, где требуется программирование именно на C.

vinvlad ★★
()
Ответ на: комментарий от vodz

Причём тут литералы

писать, например, имена файлов с количеством символов в них

ЯННП, ты вообще про что? Где ты пишешь имена файлов которые не литералы?

no-such-file ★★★★★
()
Ответ на: комментарий от Deleted

Вот то что уровень не высок, это да.

Вот это «да». Человек не написал ничего сложнее хелоуворлда, но рассуждает о высоких материях.

только вот повар не делает правильно, правильного способа готовки мяса не существует в принципе

Человек, бросающий сырое мясо в костёр и обсуждающий кулинарное искусство с поваром - это вы. PS: повар в шоке.

Если для тебя это не так то ты странный.

Я, но не ты. Логика / 0.

RazrFalcon ★★★★★
()
Ответ на: комментарий от vinvlad

Да, грамотно и надёжно писать на C может далеко не каждый - но это не недостаток языка.

Для начальства - недостаток.

RazrFalcon ★★★★★
()
Ответ на: комментарий от hobbit

Можешь поинтересоваться у корпорации ORACLE, как она пыталась закрыть OpenOffice и MySQL

Ответ: Никак. Так как если б и закрыла, то всё что было доступно до закрытия осталось бы доступно под прежней лицензией.

grem ★★★★★
()
Ответ на: комментарий от no-such-file

Где ты пишешь имена файлов которые не литералы?

Везде. Все ядерные функции работы с файлами имеют в качестве параметра имени файла — нультерминальные строки. Получаемые в том числе в результате действий, описываемых в данном топике, например: snprintf(path_buf, PATH_MAX, «%s/%s.%d», PATH_RUN, program_invocation_short_name, getpid());

vodz ★★★★★
()
Ответ на: комментарий от RazrFalcon

Вот это «да». Человек не написал ничего сложнее хелоуворлда, но рассуждает о высоких материях.

Ну, я хотя бы не фантазирую. А вот о высоких материях даже намёка не было.

Человек, бросающий сырое мясо в костёр и обсуждающий кулинарное искусство с поваром - это вы

Лучший способ, улететь в космос крайностей. Круто чё. Мммм, а ты нарцисс, как был так и остался. Расчёску для ЧСВ пора менять :D

Я, но не ты.

Естественно, мы все разные.

я

Думать о разном, заниматься разным и для всего иметь «свой» взгляд и мысли это нормально

ты

Логика / 0.

Оооооок, вопросов нет. Интересно было поболтать, до свидания. Топ-топ-топ-топ….

P.S.: Будь подобрее, может ты там и умный, но злой как я не знаю что.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от vinvlad

Да, грамотно и надёжно писать на C может далеко не каждый - но это не недостаток языка

Вот за одну эту фразу можно уже увольнять.

slovazap ★★★★★
()
Ответ на: комментарий от hobbit

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

Deleted
()
Ответ на: комментарий от slovazap

... Да, грамотно и надёжно писать на C может далеко не каждый - но это не недостаток языка

Вот за одну эту фразу можно уже увольнять.

А ты не отдельные фразы выдергивай, а весь пост попытайся «переварить» ) Или способностей не хватило? Тебе видимо задачи просто не попадались низкоуровневые, вот ты наивно и считаешь, что все можно делать на языках уровнем повыше С.

vinvlad ★★
()
Ответ на: комментарий от Deleted

Не сомневался что по сути обсуждения у тебя возражений нет. Серьёзно, как можно прямо заявить что «надёжно писать на C может далеко не каждый», и при этом спорить с тем что C не должен использоваться нигде. На ум приходит только элитизм, что премерзко для человека, и вредно для бизнеса.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

На любом языке писать надежно может далеко не каждый, нужен опыт везде!

Deleted
()
Ответ на: комментарий от vinvlad

А ты не отдельные фразы выдергивай, а весь пост попытайся «переварить» ) Или способностей не хватило?

А вы можете аргументировано вести обсуждение, а не на детсадовском уровне, с «или слабо?» и «а мой папа твоего на C перепишет». Ты прямо написал - «грамотно и надёжно писать на C может далеко не каждый - но это не недостаток языка». Это неимоверный бред, потому что только и недостатком языка это и является. Он неэффективен и небезопасен.

И нет, людьми это не решается - если «далеко не каждый», значит бизнес потратит больше денег на более редкого разработчика, а получит то же самое, потому что даже редкий разработчик от ошибок не застрахован. И получит по полной программе, потому что C позволяет ошибки самые разрушительные.

Тебе видимо

Гаданием на кофейной гуще что мне видимо со своими приятелями можешь заниматься, а тут изволь приводить объективные аргументы.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Да нет, есть варианты проще. Есть хобби, а программирование это хобби для многих и тут вырастает огромная разница между элитизмом, бизнесом и прочим. Когда программирование это твоя профессия и ты по сути инженер, а код твой инструмент это одно. А хобби это иное там твоя воля на 100% Тебе нравится язык, ну тупо вот нравится и всё и ты на нём пишешь то что тебе надо и всё. В этом случае аргументы по применимости не катят. Вот кто-то на PHP гуй пишет… или тому подобное. А вот должен или нет использоваться надо смотреть не идеологически, а технически. Если у меня atmega8L и тулчейн готовый и отлаженный, то будет крайне странно городить прошивку для замеров двух датчиков на чём то ином кроме С. Ну как пример. Хотя даже там может быть вообще свой микро язык чисто под задачу, да хоть Rust через последующую трансляцию

надёжно писать на C может далеко не каждый

Ну надёжно на любом языке может писать далеко не каждый )) Просто на С надёжно писать нет не сложнее, как бы сказать эмм нужно быть гораздо более внимательным из за ручного управления всем, вот и вся разница.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от slovazap

ну вот представь себе, что тебе нужно запрограммировать какой-нибудь микроконтроллер... Или те же драйвера писать ты на чем собираешься? На Java? )) Да, такими задачами может заниматься далеко не каждый. Те же модули ядра грамотно и надежно программировать может далеко не каждый. Вон, полно людей, которые и высокоуровневый СУБД-шный SQL освоить не способны.

Ну вот такая картинка сложилась, что в программирование лезет очень много людей, которым бы лучше было заняться чем-нибудь другим...

vinvlad ★★
()
Ответ на: комментарий от RazrFalcon

это точно
моя изначальная задача была «выкачивать данные по http и складывать их в базу». Ссылок может быть овердофига. Потом добавилась сортировка и понеслось. Работать с https я отказался. Мог сделать это на Qt, но в тот момент многие моменты были неясны, это сейчас понятно что можно использовать кастомный эвентдиспетчер на EPOLL...((

ocr
() автор топика
Ответ на: комментарий от Deleted

А хобби это иное там твоя воля на 100%

О, другой разговор пошёл. То про адекватность начальства заикаются, а как аргументов не находится, сразу началась песня про хобби. Раз хобби, так и пиши - C, как brainfuck и другие эзотерические языки, подходит только для ненормального программирования в собственное удовольствие. И не заикайся про него когда речь идёт про реальные проекты.

Просто на С надёжно писать нет не сложнее, как бы сказать эмм нужно быть гораздо более внимательным из за ручного управления всем

Опять взаимоисключающие параграфы. Не сложнее, но, эмм-как-бы-млин-это-так-вывернуть-потому-что-признать-неправоту-ой-как-не-охота, сложнее.

вот и вся разница.

Вся разница в том что в C в отличие от ЯП ничего нет чтобы полностью предотвратить целые классы ошибок и целые виды ручной работы. При этом у него над этим ЯП нет ни одного преимущества, в том числе по размеру и скорости машинного когда.

Но да, на нём можно комфортно застрять если за 20 лет не нашлось умственных способностей хотя бы посмотреть на что-то современное, и да, можно комфортно считать себя низкоуровневой элиткой. Но в реальном мире это считается не преимуществами языка, а недостатками людей.

slovazap ★★★★★
()
Ответ на: комментарий от vinvlad

ну вот представь себе, что тебе нужно запрограммировать какой-нибудь микроконтроллер…

Представлять мне ничего не нужно, я пишу под микроконтроллеры на C++ и микропитоне.

Те же модули ядра грамотно и надежно программировать может далеко не каждый. Вон, полно людей, которые и высокоуровневый СУБД-шный SQL освоить не способны.

К чему вся эта балаболия? Я жду хоть каких-то аргументов почему хоть что-то нужно и можно писать на C. Пока всё что я увидел - твои представления о программировании микроконтроллеров на уровне прошлого века.

slovazap ★★★★★
()
Ответ на: комментарий от vinvlad

Да, такими задачами может заниматься далеко не каждый

Вау, сколько ЧСВ. А ведь область совершенно тупая, задрачивается монотонной долбежкой с железом в течение нескольких лет.

У какого-нибудь джава-энтерпрайза, или в серьезных конфигурациях 1С, сложность на порядок выше.

anonymous
()
Ответ на: комментарий от slovazap

ты, я смотрю, читать слова умеешь, а смысл воспринимать абсолютно не в состоянии ) - слишком зациклен на своей конкретной области деятельности. Никто ж не утверждает, что всё надо программировать на C - и уж точно здесь не скорость работы является главным критерием. Повторю еще раз: разным задачам - свой набор подходящих языков.

Ну тема-то открыта про C, и для тех, кто пользует C (наряду с другими языками - не надо считать себя самым умным и самым современным-продвинутым).

vinvlad ★★
()
Ответ на: комментарий от vinvlad

Повторю еще раз: разным задачам - свой набор подходящих языков.

Не надо юлить. Ответь прямо на вопрос - каким задачам подходит C? И аргументируй.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

по полочкам:
- питона я не знаю и даже не знаю на что он способен
- первое что приходит в голову это libev или libevent
- у меня небыло опыта работа с человеком который меняет правила находу. Сейчас я понимаю что выход один- не работать с такими заказчиками и только по техзаданию
- лаг в производительности между си и плюсами в моем случае выравнивается дополнительными пятью баксами за впс, вообще размышлять даже не имеет смысла.

По поводу срача «зачем нам си», уверен что нужен для написания библиотек которые могут использоваться в проектах для которых производительность критична. Важен тот факт что стоимость обучения плюсам намного выше чем си, поэтому за проект на си проще взяться, а при низкой квалификации, сложнее его закончить

В моем случае си это ошибка

ocr
() автор топика
Ответ на: комментарий от slovazap

anonymous: Вау, сколько ЧСВ. А ведь область совершенно тупая, задрачивается монотонной долбежкой с железом в течение нескольких лет.

Не надо юлить. Ответь прямо на вопрос - каким задачам подходит C?

Да я вроде тебе уже привел примеры - ты просто не читаешь ) А у anonymous-а вообще фантазия разыгралась... )

Ну вот, к примеру, мы здесь на LOR-е беседуем. Ядро Linux-а на чем написано? И с чего вы решили, ребятишки, что только вы одни другие языки знаете?

vinvlad ★★
()
Ответ на: комментарий от slovazap

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

Deleted
()
Ответ на: комментарий от ocr

лаг в производительности между си и плюсами в моем случае выравнивается дополнительными пятью баксами за впс

И что такого в C++, что оно медленнее плюсов? Или это Эдик нашептал.

RazrFalcon ★★★★★
()
Ответ на: комментарий от vinvlad

Да я вроде тебе уже привел примеры - ты просто не читаешь )

Примеры я видел и ответил, возражений не последовало. И вообще, я просил не примеров, а обоснования почему им подходит C.

Ну вот, к примеру, мы здесь на LOR-е беседуем. Ядро Linux-а на чем написано?

Выше я уже кого-то тыкал носом в несусветную глупость использования легаси как аргумента за язык. Мне не сложно, ткну ещё раз: даже если забыть про абсурдность такого аргемента, легаси, вообще-то, кладезь аргументов за НЕприменимость C, о чём кричит каждая ошибка и уязвимость в коде за всё его историю.

И с чего вы решили, ребятишки, что только вы одни другие языки знаете?

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

slovazap ★★★★★
()
Ответ на: комментарий от Deleted

Так он умер, причём уже давно. Просто если вы не программируете, вы этого и не увидите - отмашки вам никто не даст.

slovazap ★★★★★
()
Ответ на: комментарий от RazrFalcon

Да все практически, например sprintf vs stringstream. Можно конечно писать на си с классами, но это другое.

Deleted
()
Ответ на: комментарий от slovazap

Представлять мне ничего не нужно, я пишу под микроконтроллеры на C++ и микропитоне.

показать результаты своей жизнедеятельности можешь ?

anonymous
()
Ответ на: комментарий от slovazap

использования легаси как аргумента за язык

Почему не начнут использовать другой язык в ядре? Могли бы чего нибудь сделать если бы захотели, да и Линус говорит что ничего лучше так и не придумали.

Deleted
()
Ответ на: комментарий от slovazap

И вообще, я просил не примеров, а обоснования почему им подходит C.

Ну вот самый простой пример: тебе надо обращаться напрямую к конкретным адресам оперативной памяти... Большинство высокоуровневых языков тебе такой возможности не предоставляют. Или, к примеру, runtime-среда не имеет механизма динамического выделения-управления памятью, без чего использование высокоуровневых языков просто в принципе не прокатывает...

vinvlad ★★
()
Ответ на: комментарий от RazrFalcon

Если бы Линус начал его писать сейчас, он опять бы выбрал С.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.