Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не зная брода, не лезь в воду. Часть вторая. 
:(
    Опции темы
500mhz
Дата 9.2.2012, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Осталось найти "винзип" который использует printf для регистрации


--------------------

PM MAIL ICQ   Вверх
feodorv
Дата 3.5.2012, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



У wsprintf есть одна особенность - функция не запихивает в результирующий буфер более 1024 символов. Поэтому можно писать такое:
Код

char buf[1024];
wsprintf( buf, "...", ...);

не опасаясь за переполнение буфера. Однако здесь программиста поджидает неожиданность: при полном заполнении буфера он не будет оканчиваться символом '\0'! Впрочем, поведение аналогичное strncpy. Но в результате корректный код должен быть таким:
Код

char buf[1024];
wsprintf( buf, "...", ...);
buf[1024-1] = '\0';



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bsa
Дата 3.5.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Пожалуйста ссылку на пункт в стандарте библиотеки, который это описывает.
PM   Вверх
feodorv
Дата 3.5.2012, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(bsa @  3.5.2012,  23:20 Найти цитируемый пост)
Пожалуйста ссылку на пункт в стандарте библиотеки, который это описывает. 

Ну, про 1024 байта можно почитать здесь:
Цитата

The maximum size of the buffer is 1,024 bytes.


Про то, что результирующий буфер может и не заканчиваться '\0' - там же:
Цитата

The string returned in lpOut is not guaranteed to be null-terminated. 


Можно и провести эксперимент:
Код

#include <windows.h>

#pragma comment( lib, "User32.lib")

int main( void )
{
  char buf[2048];
  char str1[760], str2[760];
  int rv, len;

  memset( buf, '\0', sizeof(buf));
  memset( str1, '1', sizeof(str1)-1);
  str1[sizeof(str1)-1] = '\0';
  memset( str2, '2', sizeof(str2)-1);
  str2[sizeof(str2)-1] = '\0';

  rv = wsprintf( buf, "%s%s", str1, str2);
  len = strlen(buf);
  printf( "Return value: %d, length: %d\n", rv, len);

  return 0;
}


Результат:
Цитата

Return value: 1024, length: 1024


Аналогично ведут себя _sn...printf... - функции, только возвращают -1.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bsa
Дата 3.5.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



msdn к стандарту не имеет особо отношения.
PM   Вверх
feodorv
Дата 3.5.2012, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(bsa @  4.5.2012,  00:08 Найти цитируемый пост)
msdn к стандарту не имеет особо отношения. 

Что же. Давайте программировать только по стандарту и стандартизированным вызовами smile 

А wsprintf таки пишет завершающий '\0' при полном заполнении буфера на 1024 байта, но только как 1025 байт... Итого:
Код

char buf[1025];
wsprintf( buf, "...", ...);

есть правильный код  smile 

Это сообщение отредактировал(а) feodorv - 3.5.2012, 23:30


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 3.5.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(feodorv @  3.5.2012,  23:29 Найти цитируемый пост)
wsprintf

Дык это же вообще не сишная функция.
Это чистый винапи, такая же как например CreateFile или CreateWindow
Строго говоря она не имеет к printf/swprintf никакого отношения.
Чем-то их напоминает, да, пожалуй. Но не сильно.
У нее и формат другой, походу.

PM MAIL   Вверх
feodorv
Дата 4.5.2012, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(volatile @  4.5.2012,  00:58 Найти цитируемый пост)
Дык это же вообще не сишная функция.

Я прошу прощения, если здесь нельзя писать не о сишных функциях. 

PS Мне вот интересно стало, а флагманский продукт, продвигаемый автором топика, тоже только на чистый С/C++ настроен (хотя и работает исключительно в виндах и совместно с майкрософтовским продуктом), или всё-таки учитывает виндовую спицифику?))))

Это сообщение отредактировал(а) feodorv - 4.5.2012, 00:43


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0957 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.