pat-bl-1029

pat-bl-1029

2017-01-20

  • 字符串遍历&比较
  • 坑点:最后一个测试点的坏键在最后,如果循环的跳出条件写的有问题(比如以遍历完字符串2为结束)就会出错
/**
 * pat-bl-1029
 * 2017-01-20
 * C version
 */
#include<stdio.h>
#include<string.h>

int main()
{
  freopen("in.txt", "r", stdin);
  char str1[100], str2[100];
  int alp[26] = {0}, num[10] = {0}, _flag = 0;//分别是字母、数字和下划线是否坏掉的标志
  scanf("%s", str1);
  scanf("%s", str2);
  // printf("strlen(str1) = %lu\n", strlen(str1));
  // char test1 = 'a', test2 = 'A';
  // printf("a: %d, A: %d\n", test1, test2);
  //把两个字符串中的小写都变成大写字母
  for(int i = 0;i < strlen(str1);i++)
  {
    if(str1[i] <= 'z' && str1[i] >= 'a')
    {
      str1[i] -= 32;
    }
  }
  for(int i = 0;i < strlen(str2);i++)
  {
    if(str2[i] <= 'z' && str2[i] >= 'a')
    {
      str2[i] -= 32;
    }
  }
  //printf("str1 = %s, str2 = %s\n", str1, str2);
  //遍历字符串1,和字符串2的当前字符比较,如果相等,两个当前位置都后移,继续比较;否则输出该坏键
  //注意循环控制条件应该是字符串1是否结束而非字符串2,不然会导致在字符串末尾的坏键没有被判断
  int j = 0;
  for(int i = 0, j = 0;i < strlen(str1);i++)
  {
    if(str1[i] == str2[j] && j < strlen(str2))
    {
      j++;
    }
    else
    {
      if(str1[i] <= '9' && str1[i] >= '0')
      {
        if(num[str1[i] - '0'] == 0)//该坏键第一次出现,输出坏键,并置标志位为1
        {
          printf("%c", str1[i]);
          num[str1[i] - '0'] = 1;
        }
      }
      else if(str1[i] == '_')
      {
        if(_flag == 0)
        {
          printf("_");
          _flag = 1;
        }
      }
      else if(str1[i] <= 'Z' && str1[i] >= 'A')
      {
        if(alp[str1[i] - 'A'] == 0)
        {
          printf("%c", str1[i]);
          alp[str1[i] - 'A'] = 1;
        }
      }
    }//else end
  }
  putchar('\n');
}

-FIN-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值