一、printf函数打印一个%不显示的问题
我的一个朋友向我求助,说使用printf函数打印的%不显示,程序的代码和运行结果如下:
#include <stdio.h>
int main()
{
int x=3,a=6,y=10;
printf("x+a%3*(x+y)%2/4=%.2f",(double)(x+a%3*(x+y)%2/4));
return 0;
}
想要解决这个问题其实很简单,只要在printf中输入两个%就行(%%),修改后的代码如下:
#include <stdio.h>
int main()
{
int x=3,a=6,y=10;
printf("x+a%%3*(x+y)%%2/4=%.2f",(double)(x+a%3*(x+y)%2/4));
return 0;
}
可以看到,当输入两个%后,printf函数就成功打印出了一个%,而且%后的数字也能显示出来了
二、printf函数打印%的规律
(1)printf打印连续的%
printf函数打印%号的规律用以下代码来演示:
#include <stdio.h>
int main()
{
printf("一个百分号:%\n");
printf("两个百分号:%%\n");
printf("三个百分号:%%%\n");
printf("四个百分号:%%%%\n");
printf("五个百分号:%%%%%\n");
printf("六个百分号:%%%%%%\n");
printf("七个百分号:%%%%%%%\n");
printf("八个百分号:%%%%%%%%\n");
printf("九个百分号:%%%%%%%%%\n");
printf("十个百分号:%%%%%%%%%%\n");
return 0;
}
不难发现:
当输入的%个数为偶数时,printf函数打印出%的个数为:输入的%的个数/2
当输入的%个数为奇数时,printf函数打印出%的个数为:(输入的%的个数-1)/2
(2)printf函数中%结合的规律
这是打印连续的%的情况,下面我们来看看在%之间插入其他字符,最终打印出的结果会是怎么样?
#include <stdio.h>
int main()
{
printf("一个百分号:%34*\n");
printf("两个百分号:%4%3*\n");
printf("三个百分号:%4%3%2*\n");
printf("四个百分号:%4%3%2%1*\n");
printf("五个百分号:%?%!%8%7%3*\n");
printf("六个百分号:%345%4+%?0%6%!!%!3*\n");
printf("七个百分号:%%%%f%%%3*\n");
printf("八个百分号:%b%%%$%%%%3*\n");
printf("九个百分号:%$%%%%%1%%%3*\n");
printf("十个百分号:%%^%%%2@%%h%%%3*\n");
return 0;
}
从代码和运行结果不难分析出:
%会跳过数字字符,与非数字字符结合,打印出相应的字符(这也是为什么,在打印偶数个连续的%时,打印的%个数会减半;在打印奇数个连续的%时,打印的%个数 = (输入的%的个数-1)/2,落单的%会被抛弃,这也解释了最开始的程序,%后的数字字符没有显示出来的原因)
三、printf函数打印多个%
为了解决打印多个%个数减半的问题,我们可以通过printf格式化打印输出多个%
#include <stdio.h>
int main()
{
printf("一个百分号:%c\n",'%');
printf("两个百分号:%s\n","%%");
printf("三个百分号:%s\n","%%%");
printf("四个百分号:%s\n","%%%%");
printf("五个百分号:%s\n","%%%%%");
printf("六个百分号:%s\n","%%%%%%");
printf("七个百分号:%s\n","%%%%%%%");
printf("八个百分号:%s\n","%%%%%%%%");
printf("九个百分号:%s\n","%%%%%%%%%");
printf("十个百分号:%s\n","%%%%%%%%%%");
return 0;
}
通过printf格式化输出%,就可以使输入的%的个数与输出的%的个数一致
通过printf格式化输出,也能避免%跳过数字字符,打印出我们想要的结果:
#include <stdio.h>
int main()
{
printf("一个百分号:%s\n","%34*");
printf("两个百分号:%s\n","%4%3*");
printf("三个百分号:%s\n","%4%3%2*");
printf("四个百分号:%s\n","%4%3%2%1*");
printf("五个百分号:%s\n","%?%!%8%7%3*");
printf("六个百分号:%s\n","%345%4+%?0%6%!!%!3*");
printf("七个百分号:%s\n","%%%%f%%%3*");
printf("八个百分号:%s\n","%b%%%$%%%%3*");
printf("九个百分号:%s\n","%$%%%%%1%%%3*");
printf("十个百分号:%s\n","%%^%%%2@%%h%%%3*");
return 0;
}
那么最开始的代码也可以修改为:
#include <stdio.h>
int main()
{
int x=3,a=6,y=10;
printf("x+a%c3*(x+y)%c2/4=%.2f",'%','%',(double)(x+a%3*(x+y)%2/4));
return 0;
}
可以看到:效果与输入两个%一致