这个题目的题型叫模拟,就是按照约定执行相应的程序得到结果。
p1,为1时填充小写字母,为2时填写大写字母(数字不用变),为3时用号填充
p2,为k时,填充k个
p3,为1时,正常填充,为2时逆序填充
特殊情况 b-a,b-b 减号左边大于等于右边要直接输出;减号填充时左右俩边要相同属性(字母或数字)才能填充;a-b,或1-2直接输出ab,12;
做这种题目要一步一步解决,首先我们可以写一个判断程序来解决(减号填充时左右俩边要相同属性(字母或数字)才能填充和b-a,b-b 减号左边大于等于右边要直接输出),
再写个填充程序来将a-c直接的展开,这个我们需要将原数组进行变动,所以可以增加另一个数组来存-(减号)后面的数据,**等解决
*减号展开的问题后再把原来的数据(另一个数字)复制都后面;这样可以快一点;

#include<stdio.h>
#include<string.h>
int isfun(char z1,char z2)//判断是否可以填充 
{
	if(!((z1>='0'&&z1<='9'&&z2>='0'&&z2<='9')||(z1>='a'&&z1<='z'&&z2>='a'&&z2<='z')))return 0;
	if(z1>=z2)return 0;//判断这种情况c-a或a-a,1-1,4-1 
	else return 1;
	
}
char *tianfun(char *a,char z1,char z2,int p1,int p2,int p3)//填充里面的东西 
{
	if(z2==z1+1)return a;//对这种情况的解决a-b  
	int i;
	char *s=a,*j,*k;
	while(z1<z2-1)//a-d之间的填充 
	{
		if(p1==1)
		for(i=0;i<p2;i++)*a=z1+1,a++;
		else if(p1==2){if((z1>='a'&&z1<='z'))for(i=0;i<p2;i++)*a=z1+1-32,a++;
						else for(i=0;i<p2;i++)*a=z1+1,a++;}
		else {for(i=0;i<p2;i++)*a='*',a++;}
		z1=z1+1;
		
	}
	if(p3==2)//是否逆序 
	{
		j=s,k=a-1;
		char t;
		while(j<k)
		{
			t=*j;
			*j=*k;
			*k=t;
			j++;
			k--;
		}
	}
	return a;
} 
int main()
{
	int p1, p2 , p3;
	scanf("%d%d%d",&p1,&p2,&p3); 
	char a[10000],b[100000];
	scanf("%s",&a);
	char *s=a,z1,z2;
	while(*s)
	{
		if(*s!='-')s++; //判断- 
		if(*s!=0){z1=*(s-1),z2=*(s+1);}//取-前后的字母 
		if(*s=='-'&&isfun(z1,z2))//判断是否要填充 
		{
			strcpy(b,s+1);//向把-后面的先保存在另一数组 
			s=tianfun(s,z1,z2,p1,p2,p3); //填充 
			strcpy(s,b);//填充完后还回来 
		} 
		s++;
	}
	printf("%s",a);
	
}