![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#71 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]()
Так не поступают профессионалы. Если неизвестно сколько выделять, то сначала нужно с этим определиться, либо строить код так, чтобы это происходило автоматически. Решение и того и другого зависит от конкретной задачи и инструментария. strcat предназначен для быстрой конкатенации строк с заранее подходящим буфером. Это позволяет избегать ненужных сравнений размера.
Для контроля переполнения буфера есть strncat, который принимает размер буфера и не даст его переполнить. Автор статьи, видимо, не в курсе, что такая функция есть. Последний раз редактировалось Croessmah; 27.06.2017 в 21:46. |
![]() |
![]() |
![]() |
#72 |
Пользователь
Регистрация: 18.06.2017
Сообщений: 55
|
![]()
То, что конкретно мне неудобно, я показал на своём (пусть и некрасивом) примере, в котором я выделяю память внутри функции, а чищу её в совсем другом месте, и это тоже не всегда удобно.
|
![]() |
![]() |
![]() |
#73 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]() |
![]() |
![]() |
![]() |
#74 |
Пользователь
Регистрация: 18.06.2017
Сообщений: 55
|
![]()
Речь именно об этом, и именно поэтому strcat и т.п. уже проехали.
автор статьи - бывший руководитель команды программистов Microsoft Excel, а также сооснователь Stack Overflow. Сама статья довольно старая, но суть проблемы, тем не менее, актуальна. В этом отрывке он скорее намекает на то, что, грубо говоря, под слово "Боря" выделен массив в 1000 char. А надо - всего 4. |
![]() |
![]() |
![]() |
#75 |
Пользователь
Регистрация: 18.06.2017
Сообщений: 55
|
![]()
и, тем не менее, не очень удобно. Например, когда выделение памяти (вызов функции) происходит в конструкторе.
вот бы ещё при помощи этих умных указателей организовали нормально сложение C-строк, чтобы мы тут не изобретали велосипеды. И чтобы для сложения a и b не приходилось вызывать функцию с 3 или 4 аргументами, и всё равно бы мы получали результат не в том виде, каком нужно. Последний раз редактировалось bugaboo; 27.06.2017 в 22:10. |
![]() |
![]() |
![]() |
#76 | ||
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]() Цитата:
Цитата:
Надо 5. И надо было выделять 5, а не 1000. Часто сидите на подвешенной к потолку люстре? Нет? А почему? Наверное, неудобно, можно упасть, надо как-то туда еще забраться так ведь? А причина всего этого в чем? В том, что люстра не для этого предназначена. Вот и strcat не предназначен для решения такой проблемы. Его цель - копирование char'ов в заранее подготовленный буфер, причем он не знает как этот буфер выделялся. Простой пример: Код:
Неизвестен размер буфера. Как его определить? Никак. Ок, переделали strcat так, что он теперь принимает размер буфера и изменили наш код: Код:
Если с помощью free и malloc, то мы тупо сделаем фигню, потому что буфер выделялся функцией my_allocate_buffer, которая, возможно, использовала не malloc (и подобные), а значит к такому указателю применить free нельзя. Это значит, что наша новая strcat должна еще принимать указатели на функцию аллокации и удаления. Уже не хилый интерфейс, да? strcat решает задачу копирования символов, а не задачу копирования символов с перераспределением памяти (это уже несколько задач, кстати). Последний раз редактировалось Croessmah; 27.06.2017 в 22:22. |
||
![]() |
![]() |
![]() |
#77 |
Пользователь
Регистрация: 18.06.2017
Сообщений: 55
|
![]()
Так давайте прекратим его обсуждение в рамках данной темы, поскольку он явно не всем подходит. В том числе и мне.
Никак. Просто утверждаю, что, теоретически, при помощи умных указателей могла бы быть реализована функция сложения C-строк, требующая всего 2 аргумента (слагаемые) и не накладывающая ограничений в виде заранее выделяемой конкретного размера памяти. Отнюдь, я не описался. Надо - именно 4. Когда я (тупой юзер) смотрю на слово "Боря", я знаю, что в нём 4 буквы, и, при этом, знаю, где у него начало и конец. Всё остальное - это уже вопросы реализации, и меня (тупого юзера) они в принципе не касаются. В моём мозгу (мозгу тупого юзера) слово "Боря" занимает ровно 4 ячейки памяти. А не 5, 10 или 1000. При этом, я(тупой юзер) понимаю, что "Б" + "оря" = "Боря", и для меня (тупого юзера) не секрет, где конец у "Б", где конец у "оря" и где конец у результата их сложения. Поэтому я (тупой юзер) хочу именно функцию, которая заберёт у меня "Б" и "оря" и выдаст мне результат длиной = длина("Б") + длина("оря"), равный "Боря", и на всё остальное мне плевать, в том числе и на то, где у них там конец. При этом я (тупой юзер) не хочу следовать совету умных юзеров и использовать string, поскольку аргументы и результат мне нужны именно в виде C-строки, а точнее, в виде строки длиной = 4 символа char +- то, что меня не волнует. Чтобы с каждым из этих char я мог работать именно как с переменной типа char (что я и демонстрировал в своем примере, складывая и деля их, запуская по ним циклы и т.д.) И никакого иного типа переменные я не хочу использовать и не хочу ничего знать про них, а также про реализацию массивов char, переменных типа string и т. п. |
![]() |
![]() |
![]() |
#78 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]()
Так если юзер тупой, то дальше общаться нет смысла. Тупой юзер сломает что угодно, хоть там тысячу раз проверки и перевыделения делайте.
![]() |
![]() |
![]() |
![]() |
#79 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]() |
![]() |
![]() |
![]() |
#80 | |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,829
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
MMX сложить два числа | gansm | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 13 | 29.10.2010 05:16 |
как сложить два числа с плавающей точкой | forsy | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 19 | 29.03.2010 02:15 |
Макрос: сложить два числа | белочка | Microsoft Office Excel | 6 | 23.12.2009 22:02 |
Сложить два числа и вывести результат на экран | We1c0m3 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 23.05.2009 11:41 |
Сложить два числа | iwaniwan | Win Api | 3 | 23.04.2009 06:27 |