要求:
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入说明
输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。每个字符串长度不超过100。
输出说明
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。
输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
#include<stdio.h>
#include<string.h>
int FOUND(char(*ptr)[101],char s[])//向函数传递二维数组的指针注意如何表示一个二维数组的指针
{
int currentlen=0;
int maxlen=0;
int k=0;
char*zp=*ptr;//解引用ptr后得到一个数组,然后zp存储这个数组的地址,接下来对zp进行处理,就可以处理二维数组每一行的数组
while(*zp!='\0' )
{
if(*zp==s[k])
{
while(s[k]!='\0'){
if(*zp!=s[k]) break;
currentlen++;
k++;zp++;//指针列自增
}
zp=zp-1;
if(currentlen>=maxlen){
maxlen=currentlen;
currentlen=0;
k=0;
}
zp++;
}
else
{
zp++;
}
}
if(maxlen==strlen(s)) return 1;
else return 0;
}//字符串查找函数
void UP_to_LOW(char arr[])//大小写转换
{
int i=0;
for(i=0;i<strlen(arr);i++)
{
if('A'<=arr[i]&&arr[i]<='Z')
{
arr[i]=arr[i]+32;
}
}
}//处理不敏感情况
int main()
{
int n;
char s[101];
int num;
int k=0;int i=0;
gets(s);//目标字符串
scanf("%d",&num);//开关
scanf(" %d",&n);//行数
getchar();
char string1[n][101];//被查找字符串
char cpystring1[n][101];
for(int i=0;i<n;i++)
{
gets(string1[i]);
}//完成对n行字符串的赋值
char(*ptr)[101]=string1;//一个指向第一行一个字符的指针
for(int i=0;i<n;i++)
{
strcpy(cpystring1[i],string1[i]);
}//对原字符串进行拷贝,用来处理不敏感情况
if(num==1)//大小写敏感
{
while(k<n){
if(FOUND(ptr,s)==1)
{
i=0;
while(string1[k][i]!='\0')
{
printf("%c",string1[k][i]);
i++;
}
printf("\n");
}
k++;
ptr++;
}
}
else if(num==0)
{
UP_to_LOW(s);
for(int j=0;j<n;j++)
{
UP_to_LOW(string1[j]);
}//全部更换为小写
while(k<n){
if(FOUND(ptr,s)==1)
{
i=0;
while(cpystring1[k][i]!='\0')
{
printf("%c",cpystring1[k][i]);
i++;//打印拷贝字符串
}
printf("\n");
}
k++;
ptr++;//二维数组所对应的行数自增
}
}
return 0;
}
总体思路:1,FOUND函数用来对目标字符串进行查找,当相似长度达到目标字符串长度时返回1,打印这一行的字符串
2,针对大小写敏感这个问题,我们可以将其统一为大写或小写,进行查找,所以我们需要一个拷贝的字符串保留原字符串的值
细节:
1,current++的表达式位置一定要安排准确,先判断是否相等再步增
2,在zp指针的自增问题上,由调试我们可以看到再最后一次步增完成后若目标字符串和被查找字符串大小相等时,会指向‘\0’,再自增一步后会指向未知值,所以我们需要还原一步,确保zp自增后不超过‘\0’,让循环顺利停止
3,关于二维数组指针的声明值得注意,声明成char(*ptr)[100]的形式,而对这个指针解引用得到的是一个数组,这时候我们在用一个指针就可以处理这个二维数组中每一行的值,在Found函数中有所体现,我试过直接处理*ptr,好像不行,不知道为啥qaq
4.此外在利用二维数组进行函数调用时要指明是哪一行如string1【i】