C语言程序设计第三版题目:C语言运行结果与源代码一模一样

C语言程序设计第三版题目:C语言运行结果与源代码一模一样,第1张

C语言程序设计第三版题目:C语言运行结果与源代码一模一样

 

目录

原题目

相关知识

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,'"');
}

最终输出结果相同

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4994972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存