![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
Рассмотрим простенький примерчик:
Компилим например в cc, gcc, xLc, etc. В случае printf нулевой символ пропускается, и слово Test выводится на ура. В случае sprintf, нулевой символ пишется в buf, и соответственно на экран все что за ним не выводится. В общем, что сие? Почему различия в поведении? Баг, фича, что-то еще? В стандарте С что-нибудь сказано по сему поводу? -------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
ИМХО не баг и не фича. В первом случае format string должна пропарситься целиком, независимо от того , что будет выводиться. А во втором случае - нопмальный вывод zerro-string . Усе логично.
ЗЫ не следует думать, что при printf сначала формируется где то буффер , содержащий вывод, а потом выводится эта строка Это сообщение отредактировал(а) Sartorius - 6.1.2007, 14:07 |
|||
|
||||
| WERITAS |
|
|||
|
******** ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 2.5.2005 Где: Москва Репутация: нет Всего: 5 |
Все правильно! На то он и нулевой символ. printf выводит строчку на экран. Там не обрывается вывод. Так и надо. А в другом случае sprintf копирует в буфер. Т.е. ты конец строки вставил в начало строки, поэтому ничего и не выводится. О5 опередили! Это сообщение отредактировал(а) WERITAS - 6.1.2007, 14:15 -------------------- Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак" |
|||
|
||||
| W4FhLF |
|
||||||||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Не знаю как насчёт стандарта, но вот 10 минут в отладчике помогли сделать такие выводы:
Функция СНАЧАЛА определяет длину формата(т.е. printf: %0cTest\n), она равна 0xE, ПОСЛЕ чего она делает подстановку всех переменных. Т.е. на этом этапе мы имеем в буфере:
И в функцию CRTDLL._write передаётся указатель на буфер и длина ФОРМАТА, т.е. 0xE, а не 0x8 как может показаться.
Определяется длина формата, идёт подстановка переменных и копирование в буфер того кол-ва байт, которое равно длине формата.
При парсинге формата программа находит %s, далее программа берёт первую переменную из списка, т.е. buf и определяет её длину путём поиска \0 в строке, именно эта величина считается размером буфера при передаче параметров функции CRTDLL._write, любой текст после символа \0 не учитывается, т.к. концов строки(%s) является именно он. Ну так, в общих чертах, что непонятно спрашивайте Добавлено @ 14:28 Опередили засранцы -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||||||||
|
|||||||||||
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
Sartorius, WERITAS, W4FhLF, всем спасибо. Логику осознал.
-------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |