1 条题解

  • 0
    @ 2024-11-29 19:17:22

    其实读入文章用fget函数更好,且可以在读入后用<ctype.h>库中的tolower函数进行大小写的统一化,这样判定条件就没那么多了;还可以将判断字符是否相等单独作为一个函数。但考虑到这是新手村,所以我用最简朴的语言写了。 我也是新手,大佬轻点喷。

    #include <stdio.h>
    #include <string.h>
    int main(){
        char word[10];// 定义一个字符数组 w,用于存储要查找的单词
        char essay[1000000];// 定义一个字符数组 e,用于存储待查找的字符串
        scanf("%s",word);//读入给定单词
        getchar();//如果没有这行,第二个scanf会读入第一行末的换行符,导致第二个字符串为空
        scanf("%[^\n]",essay);//读入文章,到换行符为止。注意:用%s读入读到空格就会停。
    
        int l1 = strlen(word);// 计算单词 w 的长度
        int l2 = strlen(essay);
    
        int count = 0;//计数
        int index = -1;//记录第一个出现的位置
    
        //开始遍历
    for(int i = 0;i <= l2 - l1;i++){
    
        //判断文章中是否有给定单词。需要满足三个条件:第一个符合的字母前是空格或者行首,单词长度为l1,单词中每个字母都符合
        // 判断当前位置是否为单词的起始位置
        if((i == 0 || essay[i-1] == ' ') && ((essay[i] == word[0]) || (essay[i] - 'A' == word[0] - 'a') || (essay[i] - 'a' == word[0] - 'A')) && (essay[i+l1] == ' ' || essay[i+l1] == '\0')){
            // 在当前位置开始匹配单词 w
            for(int j = 0;j < l1;j++){
                  // 如果当前字符不匹配,且大小写转换后也不匹配,则停止匹配
                if(essay[i+j] != word[j] && (essay[i+j] - 'A') != word[j] - 'a' && (essay[i+j] - 'a' != word[j] - 'A')) break;
                // 如果匹配到了单词的最后一个字符,则表示找到了一个完整的单词
                if(j == l1 - 1 ) {
                    count++;
                    if(index == -1) index = i;
                }
            }
        }
    }
    if(count) printf("%d %d",count,index);
    else printf("-1");
    return 0;}
    

    信息

    ID
    5366
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    332
    已通过
    96
    上传者