目录
原题目
相关知识
printf("%*", ...)
ASCII编码
解释
原题目
C语言的高效和高能主要来自于指针,大多数语言都有无数的“不可能”,而c语言则是“一切皆有可能”。请按下列格式输入程序(注意不要在程序中随意加空格和换行),并上机运行程序,然后分析为什么下面程序的运行结果与源代码一模一样。
main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
本题涉及到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("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,'"'); }
最终输出结果相同
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)