LINUX.ORG.RU

Шок от С. Как склеивать строки?

 


13

7

Осваиваю си. Всё шло хорошо пока внезапно не понадобилось склеить строки (константные и переменные). Покурил stackoverflow. Предлагают 2 варианта:

Первый - создать char buf[молись_чтобы_хватило] и делать str(n)cat/sprintf в этот buf.

Второй - использовать asprintf, который расширение, нестандарт и вообще.

Вопрос: как вы склеиваете строки? Может есть какая-нибудь общепринятая либа?

Простите за нубский вопрос

★★★★★

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

вызвать strlen четыре раза вместо двух;

Где это там 4 раза?

создать строку, не оканчивающуюся нулём;

Врешь! Где? sprintf работал и работает!

УМВР.

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

у sprintf емнип адовый оверхед, который при подобной работе со строками совершенно не нужен.

к слову, strlcpy() — потокобезопасна?

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

Где это там 4 раза?

Два раза явно и по одному разу на каждое %s. Надо считать длины, запоминать, а потом печатать с помощью %.*s, указывая длину. И то, не факт, что snprintf не будет проверять каждый символ на \0. memcpy не проверяет, и поэтому сработает быстрее.

Врешь! Где?

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

УМВР.

Это не показатель.

i-rinat ★★★★★
()
Ответ на: комментарий от wakuwaku

у sprintf емнип адовый оверхед

Согласен. В микроконтроллерах printf и ей подобные используются только идиотами либо буржуями (у которых мегабайт-другой флеша в МК).

В данном случае вполне возможно, что шустрей всех будет memmove работать или memcpy.

strlcpy() — потокобезопасна?

Нет, конечно. Если кто-то начал менять буфер во время хоть strcpy, хоть memcpy, на выходе получишь черт-те что. Это ясно.

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

ну у меня тут написано «The strcpy() and strncpy() functions are thread-safe», то же касается и memcpy, а вот про бсдшные варианты ничего нигде не сказано.

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

УМВР

А ты выдели буфер побольше, заполни мусором отличным от '\0' и освободи, а потом проделай то что делал, на 90% платформ в хелло ворде, у тебя перестанет работать:)

pon4ik ★★★★★
()
Ответ на: комментарий от i-rinat

Надо считать длины, запоминать, а потом печатать с помощью %.*s, указывая длину. И то, не факт, что snprintf не будет проверять каждый символ на \0.

Точно будет проверять, это лишь дополнительное ограничение сверху на длину строки.

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

УМВР

Вспомнился анекдот:

Если бы программисты были врачами, им бы пациенты говорили например «у меня болит нога», а они бы отвечали «ну не знаю, у меня такая же нога, а ничего не болит».

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

Если массив короче на один элемент, то не спасет даже sprintf.

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