C语言中使用printf函数输出%的问题

 一、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;
}

可以看到:效果与输入两个%一致

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值