0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 17
|
||||||
1 | ||||||
strcpy - как быть?19.09.2011, 22:11. Показов 8084. Ответов 36
Метки нет (Все метки)
Всем Доброго времени суток.
Возник вопрос. В процессе работы над заданием, столкнулся с проблемой, которую не хватает сил обойти. Вот Код программы:
0
|
19.09.2011, 22:11 | |
Ответы с готовыми решениями:
36
Функция strcpy () - строка должна быть пустой? Как должна быть организована сеть офиса? Что должно быть настроено обязательно, а чего быть не должно? Как работает strcpy(), где ошибка Как заменить функцию fgets на strlen и strcpy? |
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||||||||||
21.09.2011, 15:34 | 21 | ||||||||||
Начнем с того, что размер памяти, выделенный под массив динамически, ни С, ни в С++ узнать нельзя.
При передаче же статического массива в функцию strcpy происходит неявное преобразование к указателю на char* (т.е., по сути char dest[80] и char* dest - разные вещи). В качестве примера можешь посмотреть результат работы следующей программы:
В C++ есть хитрый трюк, который позволяет с помощью шаблонов узнать размер статического массива:
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
21.09.2011, 15:35 | 22 |
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
21.09.2011, 15:50 | 23 |
Это вы показали продолжение все того же ублюдочного концепта бесконечной памяти, в веденного в язык с легкой руки K&R.
Я не вижу причин мешающих передавать в функцию копирования строк размер буфера...
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
21.09.2011, 15:50 | 24 |
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
21.09.2011, 15:57 | 25 |
Я тоже. Ну и в чем, собственно, вопрос? (Мой предыдущий пост относился к тому, что невозможно внутри функции char* strcpy(char*, const char*) узнать размер передаваемого буфера)
А если нестандартными?
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
21.09.2011, 16:05 | 27 |
С этим то никто и не спорит
Меня интересует, что может помешать писать strlcpy() ну или strncpy() на худой конец, вместо strcpy().
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
21.09.2011, 16:14 | 28 | |||||
Не знаю. Психические травмы или религиозная нетерпимость?
Ну, а в вырожденных случаях может сгодиться и strcpy:
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
21.09.2011, 16:24 | 29 |
1
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
21.09.2011, 16:27 | 30 |
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
21.09.2011, 16:30 | 31 |
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
21.09.2011, 16:32 | 32 |
ну дык возвращаемое значение должно проверяться, а его ошибочное значение - обрабатываться. В примере выше обработка опущена для краткости.
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
21.09.2011, 16:42 | 33 |
Ну я как бы откомментировал конкретный код, а не сферический)
0
|
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
|
|
21.09.2011, 17:55 | 34 |
ну раз уже развели тут такую дискуссию, добавлю от себя к вышесказанному:
strcpy() опирается на признак окончания строки (чем есть 0, в конце символьного массива), и если его в массиве не присутствует, то она отрабатывает до "посинения", чем является ошибка чтения памяти, с адресом, как правило, вне пределов адресного пространства программы.
0
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
21.09.2011, 18:14 | 35 |
На самом деле отлично компилится на OpenWatcom, даже для Netware.
Сообщение от Open Watcom 1.8 C Library reference
1
|
21.09.2011, 19:20 | 36 |
Хм, не знал. Искрене думал, что это чисто майкрософтофская приблуда. Хотя в описании OpenWatcom что-то сказанно про "улучшенную совместимость с компиляторами Microsoft", может в этом дело?
0
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
21.09.2011, 19:51 | 37 |
Kastaneda, Waterloo всё-таки семейство компиляторов, да ещё и с внешними кодогенераторами, так что возможно всякое. Кстати есть у них и клоны МСовскких компайлера и линкера...
0
|
21.09.2011, 19:51 | |
21.09.2011, 19:51 | |
Помогаю со студенческими работами здесь
37
Как написать функцию strcpy для UnicodeString? Как правильно задействовать strcpy_s вместо strcpy? Быть любимым - это больше, чем быть богатым, потому что быть любимым означает быть счастливым? Как работает strcpy с точки зрения распределения памяти? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |