Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » C++ sprintf_s

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

say24



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
пишу так:
Код:
 
char some_string[3];
int errno = sprintf_s(some_string, 2, "12");
printf("Error No: %d\n", errno);
 

Ошибка - очевидна, я её специально сделал - для примера.
Однако, я ожидаю, что получу на выходе:
 
Error No: -1
 
НО, вместо этого - приложение просто падает.
Какой смысл в "безопасной" sprintf_s вместо sprintf, если она тупо крэшится, вместо возврата ошибки? Или чего я тут не понял?

Всего записей: 261 | Зарегистр. 18-02-2003 | Отправлено: 19:50 29-05-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sprintf_s() безопасна в том, что предотвращает переполнение буффера some_string. И только.
Все современные компилеры по умолчанию в каждую функцию с локальным буффером автоматически добавляют код проверки (__security_check_cookie()) переписания области стека, где находится адрес возврата из подпрограммы, так что можно спокойно использовать sprintf().

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 20:13 29-05-2013
say24



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема как раз в том, что на глаз - проблематично проверить длину получаемой с форматом строки Попробуй посчитать - какой длины будет "%s***%08d*%.1f" и т.д.
Вписывать каждый sprintf в try-catch - идиотизм.

Всего записей: 261 | Зарегистр. 18-02-2003 | Отправлено: 20:28 29-05-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Там нечего считать- берём 2 раза по максимальному значению %s'a, и всё. Память на стеке быстро выделяется на входе в подпрограмму и ещё быстрее освобождается на выходе.

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 20:45 29-05-2013
say24



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А вот это -
Цитата:
Там нечего считать- берём 2 раза по максимальному значению %s'a
, во первых - ненадёжно (формат может оказаться крайне сложным (как у меня сейчас в реальной программе), а также мы можем и не знать максимальной длины %s), а во вторых - если речь, вдруг, идёт о массиве объектов класса (строка - в классе) с охерительной ёмкостью - получим таааакой расход памяти, что и на современном компе не влезет...
 
В общем, как обычно - сам отвечаю на свой вопрос (накопал, с момента когда спрашивал ) :
 
int _snprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format [,
   argument] ...  
);
 
вместо числа знаков (count) можно писать _TRUNCATE, что аналогично (sizeOfBuffer-1), например:
Код:
errno = _snprintf_s(buffer, size_of_buffer, _TRUNCATE, "%d", MyCounter);

Итак:

Код:
char some_string[3];  
int errno = _snprintf_s(some_string, 2, _TRUNCATE, "12");  
printf("Error No: %d\n", errno);

И получаем, именно:
Error No: -1

Всего записей: 261 | Зарегистр. 18-02-2003 | Отправлено: 21:14 29-05-2013 | Исправлено: say24, 21:21 29-05-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » C++ sprintf_s


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru