题目
题目描述
读入数据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'
。