Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660931
  • 博文数量: 81
  • 博客积分: 1659
  • 博客等级: 上尉
  • 技术积分: 1286
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-02 16:36
个人简介

专注于嵌入式和图像处理

文章分类

全部博文(81)

文章存档

2014年(1)

2013年(7)

2012年(46)

2011年(27)

分类: C/C++

2012-03-29 20:10:38

题目描述

    读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bbaa2bbaa3bb都算匹配。

输入:

输入有多组数据。
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。

输出:

输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。

样例输入

4

Aab

a2B

ab

ABB

a[a2b]b

样例输出

1 Aab

2 a2B

4 ABB

来源:

实现代码:

  1. #include<stdio.h>
  2. #include<malloc.h>

  3. #define MAX_LENGTH 20

  4. static int Isup(char ch) //是否是大写字母
  5. {
  6.     if(ch>='A'&&ch<='Z')
  7.         return 1;
  8.     else
  9.         return 0;
  10. }

  11. static int Islow(char ch) //是否是小写字母
  12. {
  13.     if(ch>='a'&&ch<='z')
  14.         return 1;
  15.     else
  16.         return 0;
  17. }

  18. static int Is_equ(char ch1,char ch2) //判断两个字符是否相等,若是字母则忽略大小写
  19. {
  20.     if(Isup(ch1)&&Islow(ch2)&&(ch2==ch1+32))
  21.         return 1;
  22.     if(Isup(ch2)&&Islow(ch1)&&(ch1==ch2+32))
  23.         return 1;
  24.     if(ch1==ch2)
  25.         return 1;
  26.     return 0;
  27. }

  28. int main(void)
  29. {
  30.     char **str; //str待匹配的多个字符串
  31.     char *pattern; //pattern匹配的字符串
  32.     int num,i,j,k;
  33.     scanf("%d",&num);
  34.     str = (char **)malloc(num*sizeof(char *));
  35.     for(i=0;i<num;i++)
  36.     {
  37.         str[i]=(char *)malloc(MAX_LENGTH*sizeof(char));
  38.         scanf("%s",str[i]);
  39.     }
  40.     
  41.     pattern = (char *)malloc(MAX_LENGTH*sizeof(char));
  42.     scanf("%s",pattern);
  43.     
  44.     for (i=0;i<num;i++)
  45.     {
  46.         j = 0;
  47.         k = 0;
  48.         while (str[i][j])
  49.         {
  50.             if (pattern[k]=='[')
  51.             {
  52.                 while (pattern[++k]!=']') //直到在[]内找到一个字符与str[i][j]相等或到']'
  53.                 {
  54.                     if(Is_equ(pattern[k],str[i][j]))
  55.                         break;
  56.                 }
  57.                 
  58.                 if (pattern[k]==']') //pattern的[]内没有一个字符与str[i][j]匹配
  59.                     break;
  60.                 else //pattern的[]内有一个字符与str[i][j]匹配
  61.                 {
  62.                     while (pattern[++k]!=']'); //移动k,使下次比较']'后面的第一个字符
  63.                 }
  64.             }
  65.             else
  66.             {
  67.                 if (!Is_equ(pattern[k],str[i][j])) //[]外只要有一个字符不匹配,整个串不匹配
  68.                     break;                
  69.             }
  70.             
  71.             k++;
  72.             j++;
  73.         }
  74.         
  75.         if(!str[i][j]&&!pattern[k]) //都同时达到串的末尾,说明整个串匹配成功,输出
  76.             printf("%d %s\n",i+1,str[i]);
  77.     }

  78.     for(i=0;i<num;i++)
  79.         free(str[i]);
  80.     free(str);
  81.     free(pattern);

  82.     return 0;
  83.     
  84. }


 

阅读(3272) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~