![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 28.01.2010
Сообщений: 17
|
![]()
Доброе время.
Первый раз услышал про программы которые печатают свой сорс код. Сначала подумал - легко, попробовал сделать и мое легкомыслие развеялось. Самая главная проблема избежать "бесконечного углубления" типа: char *prog = {"char *prog={\"char *prog={\" ... \"}\"}"}; Я нашел рабочий код куайна на С++ вот он: Код:
Например что за %с и %с%с в символьном массиве??? Почему это ... char * s = %c%s%c ...? 0xA, 0xA, 0x9, 0x22, s, 0x22, 0xA, 0x9, 0xA - что это?)) Помогите разобраться. Последний раз редактировалось fantom_ZET; 01.12.2010 в 22:51. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Ну смотрите. С синтаксисом функции printf ведь знакомы? Будем для простоты априорно считать, что знакомы.
Во-первых, что это у нас за char * s такая, и для чего она нужна? А собственно, вот для чего. Функция printf может в качестве первого аргумента принимать не только строковой литерал (как это чаще всего делается), но и указатель на Си-строку (тип char*) (и вообще, строковой литерал - лишь тривиальный частный случай этого самого char*). Поэтому следующие три варианта записи эквивалентны: Код:
Теперь по поводу 0xA 0x9 и прочих. Это коды символов по таблице ASCII. К примеру, 0xA - это символ перевода на новую строку, 0x9 - горизонтальный Tab, 0x22 - кавычка ". Итак, чтобы напечатать, к примеру, две строки из кода, с переводом на следующую строку: Код:
Код:
Идем дальше. Нетрудно вывести и прочие строки, вроде printf и закрывающей скобки. Но еще нужно как-то вывести саму строку s и это делается очень просто. То, что находится между кавычек, а равно и сами кавычки (а со всем остальным проблем нет - засунули в строку и забыли, никакой рекурсии они не вызовут), мы выведем в printf. Кавычки выведем с помощью символа 0x22, а саму строку с помощью %s. Итак, вот так вот мы выводим почти весь код, за исключением содержимого строки (кавычки выводим также): Код:
И наконец финальным аккордом - засовываем в printf вывод строки s - всего лишь "s, " в серединку строки форматирования и один аргумент в список аргументов printf. Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 18.09.2009
Сообщений: 133
|
![]()
немного не вовремя опубликовал...уже предоставлена информация...
Последний раз редактировалось JeyKip; 02.12.2010 в 00:23. Причина: Сообщение не содержало новой инфорации |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 28.01.2010
Сообщений: 17
|
![]()
Гром, огромное спасибо вам. В голове теперь ясное солнце..
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос по БД!!!!!!!!! | L0102591 | Помощь студентам | 0 | 16.01.2010 11:52 |
Вопрос по mySQL + Вопрос по RichEdit | HTL | Общие вопросы Delphi | 4 | 01.01.2010 20:22 |
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) | Albert2008 | Общие вопросы Delphi | 4 | 21.08.2008 15:33 |
вопрос по сокетам и общение как в ICQ.Сложный вопрос... | Руслантус | Общие вопросы C/C++ | 2 | 12.08.2008 21:10 |