代码改变世界

关于字符串中的%和\的输出问题。

2019-11-22 16:42  047  阅读(462)  评论(0)    收藏  举报

 

 

#include<stdio.h>
int main(void)
{
 char ch1[10]="%%%%%";
 char ch2[10]="%%";
 char ch3[10]="%";
 char ch4[10]="%1";
 char ch5[10]="%1111";
 char ch6[10]="%1111%";
 char ch7[10]="%%1111";
 puts(ch1);
 puts(ch2);
 puts(ch3);
 puts(ch4);
 puts(ch5);
 puts(ch6);
 puts(ch7);
 printf("---------\n");
 printf("%%%%%\n");
 printf("%%\n");
 printf("%\n");
 printf("%1\n");
 printf("%1111\n");
 printf("%1111%\n" );
 printf("%%1111\n");
 printf("---------\n");
 printf("%s","%%%%%\n");
 printf("%%\n");
 printf("%s","%\n");
 printf("%s","%1\n");
 printf("%s","%1111\n");
 printf("%s","%1111%\n" );
 printf("%s","%%1111");
  
 
 return 0;
}

上面这段代码的输出为

%%%%%
%%
%
%1
%1111
%1111%
%%1111
---------
%%
%
 
 
 
%
%1111
----------
%%%%%
%
%
%1
%1111
%1111%
%%1111
 
------------------分界线---------------------
 
 

由上面的结果可以看出,用不同的方式来输出含有%的字符串,得到的结果不相同。

第一种方法和第三种方法本质上是一样的,第一种方法是先申请一块内存空间,放入一个字符串(以'\0'结尾)再将其搬到字符数组里面。

第三种的方法的话,因为字符串常量本身的值是一个地址,它告诉了%s这块内存空间的首地址,于是%s就会打印直到‘ \0’之前的所有字符。

那么中间的第二种方法呢?

本身没有利用%s来打印字符串,而在里面不能直接地打印‘%’。在这时候两个%连在一起,才算是一个%。如果只有一个%,则%号以及%后的字符不会输出,即使在这串字符后加上了%,

中间夹着的非%字符也不会打印出来,而是单单打印一个%。倘若连续两个%连在一起后面在加上一串字符,则会输出一个%加上这一串字符。

 

PS:

目前我尚且不知道原因,先在这里将规律总结出来,算是挖了一个坑吧,以后填上。 

 

ADD:

关于 \ :

另外,如果你要输出 \ ,不论你以上述何种形式进行打印 \ 都要以双数存在。