Причина следующего вывода - PullRequest
0 голосов
/ 22 сентября 2019
 #include <stdio.h>
 char *prg = "char *prg = %c%s%c;main(){printf(prg,34,prg,34);} " ;
 void main (){
 printf(prg,34,prg,34);
 }

Причина следующего вывода

char * prg = "char * prg =% c% s% c; main () {printf (prg, 34, prg, 34);} "; main () {printf (prg, 34, prg, 34);}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Эта программа является классическим примером программы, которая печатает свой исходный код на stdout.Символ 34 Ascii является литералом ascii для ", который необходим для того, чтобы иметь возможность печатать разделители строки C, не сталкиваясь с бесконечной рекурсивной задачей.Есть некоторые символы, которые нельзя использовать буквально, так как они преобразуются компилятором, одним из них является ", который исчезает при компиляции в строковом литерале, другие - экранированные литералы char \n, \t ,... в зависимости от этого, конвертировать в другой символ литерал.Это причина того, что исходный код должен быть все в одной строке (управляющие символы преобразуются самим компилятором), нельзя разрешать операторы #include ... (потому что он заканчивается символом новой строки) и другие подобные вещи.

Скомпилируйте и реорганизуйте его (для ясности вы изменили его при публикации), чтобы вы могли выводить тот же исходный код, что и компилятору.

Примечание

Код программы, чтобы точно имитировать исходную форму в выводе, должно быть записано как:

char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}

без завершающего символа новой строки в конце строки.

Если вы замените 34 на '\"', а p по значению, вы получите:

...
printf(
    "char*p=%c%s%c;main(){printf(p,34,p,34);}", 
    '\"', 
    "char *p=%c%s%c;main(){printf(p,34,p,34);}", 
    '\"');

, который сформирует исходную строку, поместив правильные разделители в правильные позиции.(примечание: %c и %s в третьем параметре больше не раскрываются)

Примечание2

Эта программа зависит от кодировки ASCII для ".Это не должно работать на кодировках EBCDIC (вы должны использовать кодировку для " вместо числа 34)

0 голосов
/ 23 сентября 2019

содержимое в * prg печатается, но вместо "% c% s% c" содержимое заменяется, почему оно встроено

Это способ printf() работает - в формате (первый prg аргумент) каждая спецификация преобразования (%c, %s) преобразует последующий аргумент (34, prg) в соответствии со спецификатором преобразования (c, s) и записывает результат в стандартный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...