字符串的展开 c语言

#include<stdio.h>
#include<string.h>
#define SIZE 101
long p1,p2,p3;

void fun (int a, int b) {
	
	int i,j;
	
	if(a >= 'a')//字母
	{
		if(p3 == 1)
		
		{	//原序列 
			for(i = a+1; i < b; i++)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 1)
					{
						printf("%c",i);
					} 
					else if(p1 == 2) 
					{
						printf("%c",i-32);
					} 
					else if(p1 == 3)
					{
						printf("*");
					}
				}
			}
		} 
		
		
		else 
		{	//倒叙 
			for(i = b-1; i >= a+1; i--)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 1)
					{
						printf("%c",i);
					} 
					else if(p1 == 2) 
					{
						printf("%c",i-32);
					}
					else if(p1 == 3) 
					{
						printf("*");
					}
				}
			}
		}
	} 
	
	else
	{//非字母
		if(p3 == 1)
		{	//原序列 
			for(i = a+1; i < b; i++)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 3) 
					{
						printf("*");
					} else 
					{
						printf("%c",i);
					}
				}
			}
		}
		else 
		{	//倒叙 
			for(i = b-1; i >= a+1; i--)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 3) 
					{
						printf("*");
					} else 
					{
						printf("%c",i);
					}
				}
			}
		}
	}
}

int main()
{
    int len;
    char str[SIZE];
    int i,j;
    int r;
    scanf("输入样例%d\n",&r);
    scanf("%ld %ld %ld",&p1,&p2,&p3);
    scanf("%s", str);
    
    len=strlen(str);
    printf("输出样例%d\n",r);
    for(i=0;i<len;i++)
    {
        /*
        处理第一个和最后一个字符
        */
        if((i==len-1 || i==0) && str[i]=='-')
        {
            printf("-");
            continue;
        }
        /*
        连续两个'-'的出现
        */
        if((str[i-1]=='-' || str[i+1]=='-') && str[i]=='-')
        {
            printf("-");
            continue;
        }
        
        /*
        当某个字符是'-'时,且前后都满足同时字母或者数字
        在ascii当中,数字的编码在48-57,也就是0-9  十个字符,而字母的编码是97-122也就是a-z;
        */
        if(str[i]=='-' && (((str[i-1]>=97 && str[i-1]<=122) && (str[i+1]>=97 && str[i+1]<=122)) || ((str[i-1]>=48 && str[i-1]<=57) && (str[i+1]>=48 && str[i+1]<=57))))    
        {
            if(str[i+1]<=str[i-1])
            {
                printf('-');
                continue;
            }
            if(str[i+1]==str[i-1]+1)
            {
                continue;
            }
            fun((int)str[i-1],(int)str[i+1]);//fun函数在上面
        }
        else  //不是'-'字符时输出
        {
            printf("%c",str[i]);
        }
    }
    
	return 0;
}

这里有一个问题,我没有搞定,也就是当出现d-d的时候,程序一直显示:Segmentation fault,好像是我哪里输入输出类型不一样了,但是如果没有这个情况,就一切正常.

但是我明明在程序当中编译了这个条件,也就是当str[i+1]==str[i-1]的时候,然后打印'-',但是我气死了不知道为什么,求大佬解答.

#include<stdio.h>
#include<string.h>
#include<math.h>
#define SIZE 101
    int p1,p2,p3;

void fun (int a, int b) {
	
	int i,j;
	
	if(a >= 'a')//字母
	{
		if(p3 == 1)
		
		{	//原序列 
			for(i = a+1; i < b; i++)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 1)
					{
						printf("%c",i);
					} 
					else if(p1 == 2) 
					{
						printf("%c",i-32);
					} 
					else if(p1 == 3)
					{
						printf("*");
					}
				}
			}
		} 
		
		
		else 
		{	//倒叙 
			for(i = b-1; i >= a+1; i--)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 1)
					{
						printf("%c",i);
					} 
					else if(p1 == 2) 
					{
						printf("%c",i-32);
					}
					else if(p1 == 3) 
					{
						printf("*");
					}
				}
			}
		}
	} 
	
	else
	{//非字母
		if(p3 == 1)
		{	//原序列 
			for(i = a+1; i < b; i++)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 3) 
					{
						printf("*");
					} else 
					{
						printf("%c",i);
					}
				}
			}
		}
		else 
		{	//倒叙 
			for(i = b-1; i >= a+1; i--)
			{
				for(j = 0; j < p2; j++)
				{
					if(p1 == 3) 
					{
						printf("*");
					} else 
					{
						printf("%c",i);
					}
				}
			}
		}
	}
}

int main()
{
    int len;
    char str[SIZE];
    int i,j;
    int r;
    while(scanf("输入样例%d\n%d %d %d\n%s\n",&r,&p1,&p2,&p3,&str)!=EOF)
    {
   /* scanf("输入样例%d",&r);
    scanf("%d %d %d\n",&p1,&p2,&p3);
    scanf("%s", &str);*/
    printf("输出样例%d\n",r);
    
    
    len=strlen(str);
    for(i=0;i<len;i++)
    {
        /*
        处理第一个和最后一个字符
        */
        if((i==len-1 || i==0) && str[i]=='-')
        {
            printf("-");
            continue;
        }
        /*
        连续两个'-'的出现
        */
        if((str[i-1]=='-' || str[i+1]=='-') && str[i]=='-')
        {
            printf("-");
            continue;
        }
        
        /*
        当某个字符是'-'时,且前后都满足同时字母或者数字
        在ascii当中,数字的编码在48-57,也就是0-9  十个字符,而字母的编码是97-122也就是a-z;
        */
        if(str[i]=='-' && (((str[i-1]>=97 && str[i-1]<=122) && (str[i+1]>=97 && str[i+1]<=122)) || ((str[i-1]>=48 && str[i-1]<=57) && (str[i+1]>=48 && str[i+1]<=57))))    
        {
            if(str[i+1]<=str[i-1])
            {
                printf("-");
                continue;
            }
            if(str[i+1]==str[i-1]+1)
            {
                continue;
            }
            fun((int)str[i-1],(int)str[i+1]);//fun函数在上面
        }
        else  //不是'-'字符时输出
        {
            printf("%c",str[i]);
        }
    }
    printf("\n");
    }
	return 0;
}

 修改代码后,发现在输出"-"的时候,我写成了'-',搞错了.然后我加入了输入样例和输出样例的字符,更加符合题目要求.最后编译所显示的是输出超限,我有点不懂了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值