字符串匹配

题目

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入
4
Aab
a2B
ab
ABB
a[a2b]b
输出
1 Aab
2 a2B
4 ABB

一直不能AC,然而看了一上午也不明白哪里有问题:

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>
int mycmp(char*a, char*b);
int main()
{
    int n;
    char input[1002][1002];
    char aim[1001];
    while (scanf("%d", &n) != EOF)
    {
        for (int i = 0; i < n; i++)
        {
            scanf("%s", input[i]);
        }
        scanf("%s", aim);

        int aim_len = strlen(aim);
        char* s1 = strchr(aim, '[');
        if (NULL == s1)
        {
            for (int j = 0; j < n; j++)
            {
                if (mycmp(aim, input[j]))
                {
                    printf("%d %s\n", j + 1, input[j]);
                }
            }
            continue;
        }
        char* s2 = strchr(aim, ']');
        int left = s1 - aim;
        int right = s2 - aim;
        for (int i = left + 1; i < right; i++)
        {
            char cmp[1000] = {0};
            char temp[1000] = { 0 };
            strncpy(cmp, aim, left);
            cmp[left] = aim[i];
            strncpy(temp, aim + right + 1, aim_len - right-1);
            strncat(cmp, temp, strlen(temp));
            for (int j = 0; j < n; j++)
            {
                if (mycmp(cmp, input[j]))
                {
                    printf("%d %s\n", j + 1, input[j]);
                }
            }
        }
    }
    return 0;
}

int mycmp(char*a, char*b)
{
    if (strlen(a) != strlen(b))
    {
        return 0;
    }
    for (int i = 0; i < strlen(a); i++)
    {
        if (tolower(a[i]) != tolower(b[i]))
        {
            return 0;
        }
    }
    return 1;
}

顺便总结 一下c语言常用的字符串操作函数:
strcmp(const char *s1, const char *s2):比较字符串是否相等,大小写敏感
strcmpi(s1, s2)/stricmp(s1, s2):比较字符串是否相等,大小写不敏感,在vs2015中,使用时需要在这两个函数前面加下划线,即_strcmpi,但是刷题不推荐使用,因为oj编译不通过这两个函数。
int tolower(int c):将大写转为小写返回。包含 ctype.h
char* strchr(const char *str, int c):在str中查询第一次出现c(字符)的位置,返回地址,未找到返回NULL。用得到的地址减去字符串的地址可以得到下标。可以检测NULL。
strncpy(dst,source+i,length):将souce字符串中从第i位开始,复制length个长度到dst中。
char* strncat(char* dest, const char *src, size_t n):从字符串src的开头拷贝n 个字符到dest字符串尾部,自动覆盖dst原有的'\0',并在最后加上'\0'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值