目录
原题目
相关知识
printf("%*", ...)
字符串与指针
ASCII编码
解释
原题目
C语言的高效和高能主要来自于指针,大多数语言都有无数的“不可能”,而c语言则是“一切皆有可能”。请按下列格式输入程序(注意不要在程序中随意加空格和换行),并上机运行程序,然后分析为什么下面程序的运行结果与源代码一模一样。
main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
C语言的高效和高能主要来自于指针,大多数语言都有无数的“不可能”,而c语言则是“一切皆有可能”。请按下列格式输入程序(注意不要在程序中随意加空格和换行),并上机运行程序,然后分析为什么下面程序的运行结果与源代码一模一样。
本题涉及到printf、字符串与指针、ascii编码的知识。
相关知识
printf("%*", ...)
printf的第一个参数是一个字符串,其中可能有一些%*占位,如%d
之后的参数分别对应第一个参数中的占位符。
如:
printf("%d %c %s", 1, 'a' , "hhh");
//分别对应整数,字符字符串
//输出结果为:1 a hhh
字符串与指针
字符串的本质是一个字符数组,以 表示字符串的终止。
而字符串变量实际上保存的是字符数组首位的指针。
如:
char *str = "abc";
printf("%sn",str); //abc
printf("%cn",*str); //a
printf("%pn",str); //00403024
printf("%pn","abc"); //00403024
运行结果截图:
ASCII编码
34对应的adcii码是双引号'"'(或写成'"')
ASCII_百度百科 (baidu.com)
解释
main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
换行后
main(){
char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";
printf("main(){char*a=%c%s%c;printf(a,34,a,34);}",34,a,34);
}
把a替换
main(){
char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";
printf("main(){char*a=%c%s%c;printf(a,34,a,34);}",34,a,34);
}
把34换成双引号
main(){
char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";
printf("main(){char*a=%c%s%c;printf(a,34,a,34);}",'"', a, '"');
}
%c,%s%c分别对应:字符类型的双引号 、字符串类型的main(){char*a=%c%s%c;printf(a,34,a,34);} 、字符类型的双引号
最终换成我们熟悉的格式
int main(){
char* string = "main(){char*a=%c%s%c;printf(a,34,a,34);}";
printf("main(){char*a=%c%s%c;printf(a,34,a,34);}",'"',string,'"');
}
最终输出结果相同



