簡體   English   中英

以下output背后的原因

[英]Reason behind the following output

 #include <stdio.h>
 char *prg = "char *prg = %c%s%c;main(){printf(prg,34,prg,34);} " ;
 void main (){
 printf(prg,34,prg,34);
 }

以下output背后的原因

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

*prg 中的內容被打印,但是代替“%c%s%c”的內容被替換,為什么它被嵌入

這就是printf()的工作方式 - 在格式(第一個prg參數)中,每個轉換規范%c%s )根據轉換說明符( cs )轉換后續參數( 34prg )並寫入結果符合標准 output。

該程序是將其源代碼打印到stdout的程序的經典示例。 Ascii 字符 34 是"的 ascii 文字,它需要能夠打印 C 字符串的分隔符而不會引發無限遞歸問題。有些字符不能按字面意思使用,因為它們是由編譯器轉換的,一個其中是" ,在以字符串文字編譯時會消失,其他是轉義的字符文字\n\t ,...取決於此,轉換為不同的字符文字。 這就是源代碼必須全部在一行中的原因(控制字符由編譯器自行轉換),不允許使用#include...語句(因為它以換行符結尾),以及其他類似的事情。

編譯它並重新排列它(為了清楚起見,您在發布時已對其進行了修改),以便您可以 output 與您提供編譯器的源代碼完全相同。

筆記

程序代碼,為了准確地模仿它在 output 中的源形式,必須寫成:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM