2021-05-15

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值