PAT系列
我要通过!
前言
提示:我是一个小白,根据自己的思路些的,代码量挺多的,但是我在运行时产生了段错误,但是我找不到原因,发出来,希望大家能够提供一些意见
一、思路
将判断分成几个函数,运用函数进行调用。
第一个函数:首先如果字符串必须满足是只含有PAT这三个字符串的,不能含有其他字符。
第二个函数:任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串,进行判断,如果不是那么调用第三个函数。
第三个函数:去除P和T中间的一个A和在末尾去除a,在调用第二个函数,看是否正确。
二、问题分析
1.可能是数组越界或者是调用函数次数过多导致的问题,希望大佬能给出解决方案,感谢!我在Xcode上面运行是完全没有什么问题的,但是在pta上面会出现段错误,我也不懂了
代码如下:
#include <stdio.h>
#include <string.h>
int First_Condition(char *b){
int i=0;
for(;i<strlen(b);i++){
if(b[i]!='A'&&b[i]!='P'&&b[i]!='T')
{
return 0;
}
}
return 1;
}
int Second_Condition(char *b){
int i=0;
if(strlen(b)%2!=0&&strlen(b)>2)
{
for(;i<strlen(b);i++)
{
if(b[i]==b[strlen(b)-1-i]&&b[i]=='A')
{
if((i+3)<strlen(b)&&b[i+1]=='P'&&b[i+2]=='A'&&b[i+3]=='T')
return 1;
}
else if(b[i]=='P'&&b[i+1]=='A'&&b[i+2]=='T')
return 1;
else
return 0;
}
}
return 0;
}
char* Processing_data(char *b){ //去掉增加项 ,在满足first_condition的条件下
char a[strlen(b)];
int i=0;
int super=100; //是否需要清除A
int Prefix_data=0;
if(strlen(b)>3){
for(i=0;i<strlen(b);i++){
if(b[i]=='A'&&b[i]==b[strlen(b)-1-i])
{
if(b[i+1]=='P'&&b[i+2]=='A'&&(i+2)<strlen(b))
{
Prefix_data=i;
}
}
else if(b[i]=='P'&&b[i+1]=='A')
{
super=i+1;
Prefix_data++;
}
if(i<strlen(b)-Prefix_data){
if(i==super){
a[i]=b[i+1];
super=0;
}
else if(super==0)
{
if(i+1==strlen(b))
break;
a[i]=b[i+1];
}
else
a[i]=b[i];
}
else if(Prefix_data!=1)
a[i-1]='\0';
}
return a;
}
else
return a;
}
void Printf(int i){ //调用打印函数
if(i==0)
printf("NO\n");
else
printf("YES\n");
}
int main(){
int n;
int i; // 0表示no 1表示Yes
scanf("%d",&n); //表示数量
char b[n][100];
while(n!=0){
i=0;
scanf("%s",b[n-1]);
if(First_Condition(b[n-1])==1){
i=Second_Condition(b[n-1]); //如果不满足第二个条件,则尝试一下第三个条件
if(i==0){
i=Second_Condition(Processing_data(b[n-1])); // 对数据进行处理调用第二个
}
}
Printf(i);
n--;
}
}