问题描述
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入说明
输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。每个字符串长度不超过100。
输出说明
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。
输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>//需要动态分配内存
char * toLowerString(const char * str);//将字符串中的字符转化为小写的函数
int main(){
char target[100];
scanf("%s", target);//读取目标字符串
int flag;
scanf("%d", &flag);//敏感选项标记
int n;
scanf("%d", &n);
char ** lines = (char **)malloc(n * sizeof(char *));
/*这里需要注意,字符串字面量被看作一个地址,一个字符串字面量其实是一个char类型的数组,
*字符串字面量相当于数组名称,是数组首元素的地址,因此这里分配内存时,需要分配n个指向
*char类型数组的指针,一个占用字节大小为sizeof(char *)*/
char buffer[100];//缓冲区字符数组
int line_count = 0;//行数标记
while (fgets(buffer, sizeof(buffer), stdin) && line_count < n){
lines[line_count++] = strdup(buffer);
}//将输入存入缓冲区字符数组,并通过strdup函数将缓冲区的值传递给lines数组
if (flag){//对大小写敏感,直接使用strstr
for (int i = 0; i < n; i++){
if (strstr(lines[i], target) != NULL){//使用strstr函数快速查找target是否是lines[i]的子字符串
printf("%s\n", lines[i]);
}
}
} else {//对大小写不敏感,需要将字符串全部转化为小写(或大写)
for (int i = 0; i < n; i++){
if (strstr(toLowerString(lines[i]), toLowerString(target)) != NULL){
printf("%s\n", lines[i]);
free(toLowerString(lines[i]));
free(toLowerString(target));//释放分配小写字符串的内存
}
}
}
free(lines);//释放内存
return 0;
}
char * toLowerString(const char * str) {
int length = strlen(str);
char * lowerStr = (char *)malloc((length + 1) * sizeof(char)); // 分配内存存储转换后的字符串
if (lowerStr == NULL) {
return NULL; // 内存分配失败
}
for (int i = 0; i < length; i++) {
lowerStr[i] = tolower(str[i]); // 转换为小写字母
}
lowerStr[length] = '\0'; // 添加字符串结束符
return lowerStr;
}