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 и собирать строку пачкой конкатенаций с аллокациями памяти и прочим...

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


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

Вообще-то ICU предоставляет api для работы с юникодом. В особенности - всякие там Toupper/tolower.

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

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

RazrFalcon ★★★★★
()

Как вариант

Правильного в этой вселенной нет ничего.


#include <stdio.h>
#include <stdlib.h>

#define ___sprintf(buf, bufsize, format, args...) { \
    { \
        FILE *MEMSTR = open_memstream(&(ptr), &(bufsize));\
        fprintf(MEMSTR, format, ##args);\
        fclose(MEMSTR);\
    } while(0);\
}

int main(){
    char *ptr;
    size_t bufsize;

    ___sprintf(ptr, bufsize, "blablabla = %d ", 42);

    printf("str = %s; size = %lu\n", ptr, bufsize);

    free(ptr);
    return 0;
}

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

Владимир

Sorry.
Это флейм /можно не читать, пока похоже на а-ля https://www.youtube.com/watch?v=SI-2DRkaVcA/.

Если реализовать, то профит будет: - простой API для доступа к символам /это не 2-х, 3--х, ... байтовая последовательность, а - ОДИН БАЙТ/;
- в СУБД было бы «сподручно» использовать строки с такой кодировкой; - ...

Да и «революции» в этом ни какой нет, ведь API будет позволять конвертировать такого рода кодовые таблицы к любой из ныне существующих.

anonymous
()

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

чтобы узнать длину строки после форматирования надо в snprintf() передать NULL, в результате вернётся длина конечной строки. выделяешь буфер нужного размера и повторно вызываешь snprintf() с этим буфером. всё.

не забудь про \0. читай маны, они рулез.

anonymous
()

А вообще было достаточно посмотреть код любой из сишных «универсальных» (например libarp) библиотек которые каждая имеет свою обертку для работы со «строками» C, чтобы понять, что это не самое сильное место С, потому как в нем как таковых строк нет, а есть символьные массивы.

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

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

чтобы понять, что это не самое сильное место С, потому как в нем как таковых строк нет, а есть символьные массивы

А чуть позже, следующим этапом, приходит осознание того, что массивов с C тоже нет, а есть куски памяти, к которым можно обращаться по смещению. И тогда наконец-то становится ясно, что C — это не тот язык, на котором вообще можно что-то писать.

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

Владимир

В новостях об новой версии gcc /девятой/ говорится о том, что в стандарт C будут внесены дополнения /не в курсе какие/.

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

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

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

Определение от бога надмозга

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

приходит осознание того, что массивов с C тоже нет, а есть куски памяти

Осознай что это и есть масив

которым можно обращаться по смещению

Да ладно, это называется указатели

И тогда наконец-то становится ясно,

Попробуй не открывать внезапно для себя то или иное, а почитай про то что говоришь хотя бы любительскую документацию в виде книжек самоучителей на 15 страниц, внезапно можно UB открыть или замудрёную конструкцию, но не как базовый функционал

что C — это не тот язык, на котором вообще можно что-то писать.

Тем не менее миллиарды строк кода есть и миллионы пишут прямо сейчас.

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

Шта, опять сайты на си?

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

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

Шта, опять сайты на си?

Прикинь да! Apache (забыл как звать суброект),Nginx module ,kore.io.

Можно, всегда ли нужно? Зачем как ситх возводить всё в абсолют? И сайты разные бывают,статика например. Почему бы и нет. Но повторюсь, можно, но всегда стоит думать, нужно ли.

Что в вебе такого особенного? Ну вот что? Ничего там нет. Единственный важный критерий это языки специально под это заточенные, тогда да, тогда правильно.

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

Что в вебе такого особенного?

Прямо по теме топика: жонглирование строками и какая-то логика этого жонглирования. И вот какая такая должна быть нужда делать это именно на си? Нет, я понимаю, что «ситуации разные бывают», но в 99.9% от всего веба (в т.ч. говносайты и «бизнес») - зачем?

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

Осознай что это и есть масив

Нет, это не есть массив.

Да ладно, это называется указатели

Точно?.. Не массивы?.. Так Вы уж определитесь тогда.

внезапно

Не, "внезапно" — это точно не ко мне. Это у Вас массивы "внезапно" стали указателями.

... миллиарды ... миллионы ...

Вам самому-то не смешно?

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

Прямо по теме топика: жонглирование строками и какая-то логика этого жонглирования.

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

И вот какая такая должна быть нужда делать это именно на си?

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

Нет, я понимаю, что «ситуации разные бывают», но в 99.9% от всего веба (в т.ч. говносайты и «бизнес») - зачем?

Свой личный проект в виде статики на слабом VPS микросервис на домашнем роутере. Максимальная скорость отдачи чего либо, потоковые данные какие. Всё то что не большое. Ну а так то да, я выше уже сказал, можно, но не всегда нужно. Есть спец языки для этого. Для говносайтов не надо, для бизнеса, ну какие то отдельные части разве что, а в целом не надо.

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

Для жонглирования строками есть Python, Go, Perl. Но разве это объяснишь адептам Си? Есть даже Objective-C, libCello, icu. Много чего «есть», но из своего болота вылезать не хотят.

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

Массивы и указатели неразлучны и не надо врать я не называл массивы указателями. Просто обращаться можно и так и так.

Вам самому-то не смешно?

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

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

Есть спец языки для этого... в целом не надо.

Ахтунг, вменяемый сишник в топике!!!!111...

(с прищуром) Или ты не сишник?.. ))

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

Я вообще не программист, хоть и пишу на С (и не только). Я просто не понимаю взрыва пуканов от него, обычный язык, особенно доставляет когда говорят про то чего в нем нет, хотя там нет этого намеренно. Не нравится/не осилил/не подходит С ну дык не пиши на нём в мире 100500 языков, нет они слюной брызжут )))

Если коротко, пропуская всю воду, в си ты делаешь всё руками, если не хочешь делать руками делаешь на нём же себе сахар и делаешь это не руками. Всё. Не добавить не отнять.

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

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

не подходит С ну дык не пиши на нём

Ты не правильный сишник )) Настоящие адепты втирают за то, что на си (в крайнем случае - крестах) надо писать всё, ибо они для ВСЕГО подходят как нельзя более, а все остальные языки - трэш и угар )

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

Для начала объясни мне каков смысл говорить про язык и вещи которых в нём нет что бы сказать что этот язык ненужен потому что этого в нём нет. Несмотря на то что то чего нет в языке быть там не должно и не может быть, просто потому что это сломает концепцию самого языка в принципе? И куда ты предлагаешь вылазить? На другие языки? А в чём проблема? Берёшь и пользуешься разными языками и всё.Зачем куда то выползать?

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

а все остальные языки - трэш и угар

Почти согласен

надо писать всё, ибо они для ВСЕГО подходят как нельзя более

Ну, такое. Можно всё, но не всё удобно вот и вся разница.

Ты не правильный сишник

Какой есть, мне Си нравится, и именно из за того от чего у всех попу рвёт, то есть в нём ничего нет, управляющие конструкции + базовые типы данных с возможностью удобно делать свои типы. Вот и всё. Хотя я тоже бомблю от c++/rust за их разросшийся наркомнский синтаксис. Для меня он ужасен, работает то оно хорошо. Но буэээ уродско как то не знаю. Тут привычка наверное нужна. Короче как были фламастеры на вкус разные так и остались. Ну и ещё задачи и инструменты никто не отменял

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

когда на питоне можно просто «Palka» + «Ogurechik»???

"{}-{}".format(palka, ogurechik)

Ну или с помощью %.

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

Какой есть, мне Си нравится

Если нравится, то практикуйся, время на доводы не трать. Придумай себе домашнее задание «написать парсер или форматировщик строк» и действуй. С первого раза будет некрасиво, но ты продолжай.

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

Настоящие адепты втирают за то

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

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

там нет этого намеренно

А пихают это ваш С всюду, где «это», которого в нём нет, нужно. Что за спецолимпиада?

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

Прояви инициативу, запили на своём языке своё и пропихивай.

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

практикуйся

У меня для практики целый игровой движок есть ))) Текста там хватает

время на доводы не трать

А почему бы нет, решил попить чайку и поболтать в треде.

Если мне надо будет быстро и не критична скорость я lua возьму )) Пердолиться с С не буду, а если надо будет быстро то возьму С и буду пердолиться выжимая максимум в рамках моих сил. Или luajit если мне не отдельные такты экономить, быстр как пуля и чист как слеза единорога. Вот и всё

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