请问xdoj 字符串查找 81题,运行结果正确,提交只有20分是为什么,怎样修改

问题

标题
字符串查找

类别
字符串处理

时间限制
2S

内存限制
256Kb

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

输入说明
输入数据第一行包含一个字符串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 main(){
    char a[101],b[101][101];
    int i=0,j=0,k=0,x[101]={0};
    int flag=0,m=0,n=0;
    gets(a);
    scanf("%d\n%d",&flag,&m);
    for(i=0;i<m;i++)
    scanf("%s",&b[i]);
    n=strlen(a);

    if(flag==1)
        for(i=0;i<m;i++){
        k=0;
            for(j=0;b[i][j]!='\0';j++){
            if(a[k]==b[i][j]){
            k++;    
            }
            else
            k=0;    
            while(k==n-1&&x[i]==0){
                puts(b[i]);
                x[i]=1;
                break;
            }    
            }
        }
    else {
    for(i=0;i<m;i++){
    k=0;
            for(j=0;b[i][j]!='\0';j++){
            if(a[k]==b[i][j]||a[k]==b[i][j]+32||a[k]==b[i][j]-32){
            k++;    
            }
            else
            k=0;    
            while(k==n-1&&x[i]==0){
                puts(b[i]);
                x[i]=1;
                break;
            }    
            }
        }
    }
    
    return 0; 
} 

别的100分代码

#include<stdio.h>
#include<string.h>

char tran(char a){
    if(a<='z'&&a>='a') return a-32;
    else if(a<='Z'&&a>='A') return a+32;
}

int main(){
    int sen,n,i,j,k,l;
    char s[101],ch[1000][101];
    scanf("%s%d%d",s,&sen,&n);
    for(i=0;i<n;i++) scanf("%s",ch[i]);
    if(sen==1){
        for(j=0;j<n;j++){//二重循环,在每一行中搜索s
            for(k=0;k<strlen(ch[j])-strlen(s)+1;k++){//防溢出
                l=0;//初始化在这里进行!
                if(ch[j][k]==s[0]){
                    for(;l<strlen(s);l++){
                        if(ch[j][k+l]!=s[l]) break;
                    }
                }
                if(l==strlen(s)){
                    printf("%s\n",ch[j]);
                    break;
                }
            }
        }
    }    
    else if(sen==0){
        for(j=0;j<n;j++){
            for(k=0;k<strlen(ch[j])-strlen(s)+1;k++){
                l=0;
                if(ch[j][k]==s[0]||tran(ch[j][k])==s[0]){
                    for(;l<strlen(s);l++){
                        if(ch[j][k+l]!=s[l]&&tran(ch[j][k+l])!=s[l]) break;
                    }
                }
                if(l==strlen(s)){
                    printf("%s\n",ch[j]);
                    break;
                }
            }
        }
    }
    return 0;
}


运行结果

输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

Hello
0
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

HelloWorld
HiHiHelloHiHi
HELLO
HELLOisNOTHello

scanf("%s",&b[i]);读取字符串不用加&
hile (k == n - 1 && x[i] == 0)
这个 while应该改成if
应该是k == n

           if (k == n && x[i] == 0)

你题目的解答代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    char a[101], b[101][101];
    int i = 0, j = 0, k = 0, x[101] = {0};
    int flag = 0, m = 0, n = 0;
    gets(a);
    scanf("%d\n%d", &flag, &m);
    for (i = 0; i < m; i++)
        scanf("%s", b[i]);
    n = strlen(a);
    if (flag == 1)
    {
        for (i = 0; i < m; i++)
        {
            k = 0;
            int t = 0;
            for (j = 0; b[i][j] != '\0'; j++)
            {
                if (a[k] == b[i][j])
                {
                    k++;
                }
                else
                {
                    j = t;
                    t++;
                    k = 0;
                }
                if (k == n && x[i] == 0)//  while应该改成if,应该是k == n
                {
                    puts(b[i]);
                    x[i] = 1;
                    break;
                }
            }
        }
    }
    else
    {
        for (i = 0; i < m; i++)
        {
            k = 0;
            int t = 0;
            for (j = 0; b[i][j] != '\0'; j++)
            {
                if (a[k] == b[i][j] || a[k] == b[i][j] + 32 || a[k] == b[i][j] - 32)
                {
                    k++;
                }
                else
                {
                    j = t;
                    t++;
                    k = 0;
                }
                if (k == n && x[i] == 0)//  while应该改成if,应该是k == n
                {
                    puts(b[i]);
                    x[i] = 1;
                    break;
                }
            }
        }
    }

    return 0;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632