XDOJ_81_字符串查找

问题描述    
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项
    当选项打开时,表示同一个字母的大写和小写看作不同的字符;
    当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入说明    
输入数据第一行包含一个字符串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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔码码的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值