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