LINUX.ORG.RU

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

 


13

7

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

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

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

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

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

★★★★★

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

Я тоже попробую.

NSMutableDictionary *m = [NSMutableDictionary new];
m[@"str"] = @1;
m[@"str"] = @([m[@"str"] integerValue] + 1);
Но сахар - не очень хорошо, потому лучше так:
NSMutableDictionary *m = [NSMutableDictionary new];
[m setObject:@1 forKey:@"str"];
[m setObject:@([m[@"str"] integerValue] + 1) forKey:@"str"];

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

ты это имел ввиду под «читить»?

Нет, на ЛОР есть персонажи, которые бы написали бы, например:

m_str = 2;

Извиняюсь, если подобное предположение задело.

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

И ты серьезно считаешь это более понятным?

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

m[@«str»] = @1;
Но сахар - не очень хорошо

Почему, сахар в меру - очень хорошо, потому-то его таки и добавили в objc, другое дело, что взяв этот вариант и сравнив с С++ все-равно будут только минусы.

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

Изначально в objective c код, который выглядит как сишный означает только то, что и в сишке. Из-за этого пришлось «@» вводить. И это плюс. А где минусы?

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

Из-за этого пришлось «@» вводить

Я про [], его добавили относительно недавно.

А где минусы?

NSMutableDictionary *m = [NSMutableDictionary new];

не указаны типы ключей и значений, нет проверок типов в compile-time. Более многословно, там где в С++ просто пишется тип и имя - тут дублирование NSMutableDictionary и т.п.

m[@"str"] = @1;

«пришлось «@» вводить» - читать проще явно не стало

m[@"str"] = @([m[@"str"] integerValue] + 1);

Тут, думаю, все очевидно.

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

m[@«str»] = @1;

/me не знал что это работает для mutable :)

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

Более многословно, там где в С++ просто пишется тип и имя - тут дублирование NSMutableDictionary и т.п.

id m = [NSMutableDictionary alloc];
waker ★★★★★
()
Ответ на: комментарий от anonymous

«пришлось «@» вводить» - читать проще явно не стало

@ как раз очень важен и полезен — он показывает что это objc объект, а не просто сишный литерал.

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

id m = [NSMutableDictionary alloc];

Не развнозначный код. И не такой читабельный, даже первый вариант на objc лучше.

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

@ как раз очень важен и полезен — он показывает что это objc объект, а не просто сишный литерал.

Так я не спорю - для objc полезен и нужен, а вот в коде на С++ просто вызывается нужный конструктор (std::string в данном случае). Ничего руками выписывать не надо, и сишный литерал остается сишным литералом.

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

Не развнозначный код.

в каком месте?

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

ты определись уже.. то тебе дублирование типа не читабельно, то наоборот.

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

в objc тоже так можно:

[NSString stringWithUTF8String:"C Literal"];

и это очень хорошо, что это делается явно, т.к. наглядно показывается, что NSString и const char[] это разные вещи. многие крестовики думают что у std::string нет оверхеда, именно из-за сахара.

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

в каком месте?

В месте типа переменной.

ты определись уже.. то тебе дублирование типа не читабельно, то наоборот.

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

в objc тоже так можно:
[NSString stringWithUTF8String:«C Literal»];

Хорошая шутка.

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

В месте типа переменной.

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

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

это ты не хочешь понять, что это аналог new из c++. если ты будешь выделять свой map через new, будет то же самое: либо auto, либо дублирование.

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

многие крестовики думают что у std::string нет оверхеда, именно из-за сахара.

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

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

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

compile-type checking, хотя тебе вроде на него вообще наплевать.

это ты не хочешь понять, что это аналог new из c++

new не полный аналог. Ну и большая часть переменных - это либо локальные, либо члены класса. И, кстати, ты ведь понимаешь какой оверхед ты получаешь используя objc в таких случаях? ;)

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

И, кстати, ты ведь понимаешь какой оверхед ты получаешь используя objc в таких случаях? ;)

да

waker ★★★★★
()

Подскажите пожалуйста, в чем будет отличие в плане размещения в памяти этих трех строк:

#include <stdio.h>

int main() {
  printf("It's Friday, Friday\n");
  char *s1 = "Gotta get down on Friday\n";
  printf(s1);
  char s2[] = "Everybody's lookin' forward to the weekend, weekend\n";
  printf(s2);
}
makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

Это вопрос был? const никак не повляет, static на s2 определенно да. s2 будет в .data. Собственно, и s1 переедет в .data, но т.к. s1 - указатель, на строку это никак не повлияет.

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

Спасибо. Узнал много нового

int A[5] = { [2] = 10, [4] = 20 }; /* C99, не C++ */

Такой код нормально компилируется свежим GCC, но далеко не все компиляторы умеют компилировать C99 (Visual Studio не умеет), а главное это не является корректным кодом на C++, поэтому вряд ли стоит использовать такую инициализацию.

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

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

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

не подскажешь текущее состояниие MSVS?

cvv ★★★★★
()
21 июня 2015 г.
Ответ на: комментарий от f1xmAn

Внезапно, стрингбилдер создается внутри цикла, точно так же как внутри цикла вызывается .toString(). Т.е. толку в этом коде от стрингбилдера ровно 0. Анонимус конечно криво выразился, но никто не вынес создание стрингбилдера из цикла, а значит по-прежнему в цикле будет создаваться новый char[] и копироваться в него все предыдущее содержимое.

//извиняюсь за некропостинг

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