先来题目
问题描述
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入说明
输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。每个字符串长度不超过100。
输出说明
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。
输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
这道题可以有很多解法,偷懒一点就是直接用string库里的函数,strstr函数可以查找字符串里面的子串,strstr(s1,s2)若在s1中找到s2则返回s2在s1的地址,否则为NULL。
#include<stdio.h>
#include<string.h>
char s[101][101];
void xiaoxie(char s[]){
int i;
for(i=0;s[i]!='\0';i++){
if(s[i]<97){
s[i]=s[i]+32;
}
}
}//先写一个变小写的函数 来适应题目里的敏感开关
int main(){
char zifuchuan[101];
int i,kaiguan,n;
scanf("%s",zifuchuan);
scanf("%d%d",&kaiguan,&n);
for(i=0;i<n;i++){
scanf("%s",s[i]);
if(kaiguan==0){
xiaoxie(s[i]);
}
}
if(kaiguan==0) xiaoxie(zifuchuan);
for(i=0;i<n;i++){
if(strstr(s[i],zifuchuan)){//如果函数有返回值 说明能在s2中找到s1那就把该字符串打印出来
printf("%s\n",s[i]);
}
}
return 0;
}
当然也有非函数方法 就是一个一个去比对,当发现一样的字母的时候狠狠咬住他,从这个点开始同时开始比对字符串和目的字符串,并且字符串里面的目的字符串是和目的字符串一样大的,别忘了count的清0
#include<stdio.h>
#include<string.h>
char s[101][101];
void xiaoxie(char s[]){
int i;
for(i=0;s[i]!='\0';i++){
if(s[i]<97) s[i]=s[i]+32;
}
}//仍然是一个大小写转换,来适应敏感开关
int chazhao(char a[],int i){
int j,k=0,t1 = 0,t2 = 0,count=0;
for(j=0;s[i][j]!='\0';j++){
count=0;//注意count清零哈!!!⚠️
if(s[i][j]==a[k]){
t1=j;
t2=k;
}//当发现一样的字母的时候开始计数
for(;s[i][t1]==a[t2]&&s[i][t1]!='\0'&&a[t2]!='\0';t1++,t2++){
count++;
}//从发现到结束 一直计数一样字母的个数
if(count==strlen(a)){
return 1;
}//若最终字母相同的个数确实等于目的字符串长度则说明有这字符串就返回1
}
return 0;
}
int main(){
char zifuchuan[101];
int kaiguan,n,i,j=0;
scanf("%s%d%d",zifuchuan,&kaiguan,&n);
for(i=0;i<n;i++){
scanf("%s",s[i]);
if(kaiguan==0) xiaoxie(s[i]);
}
if(kaiguan==0)xiaoxie(zifuchuan);
for(i=0;s[i][j]!='\0';i++){
if(chazhao(zifuchuan,i)){
printf("%s\n",s[i]);
}
}
return 0;
}