lala哇 2022-02-05 23:25 采纳率: 100%
浏览 143
已结题

请问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

  • 写回答

2条回答 默认 最新

  • 关注

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月14日
  • 已采纳回答 2月6日
  • 创建了问题 2月5日