一根弦是否在另一根内?

时间:2015-10-31 09:54:25

标签: c string function

用户为我们提供更长的字符串s和更短的字符t

如果t位于s,其中字符?中的符号t可用作任何字符,则会显示一条消息。

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

int isit(char*,char*,int);
int main()
{
    char s[20],t[20];
    int k,i,fir;
    puts("Enter first string");
    gets(s);
    puts("Enter second string");
    gets(t);

    k=strlen(s)-strlen(t);

    for(i=0;i<=k;i++){
        fir=i;
        if(isit(s,t,fir)==1){
            printf("It's in there");
            return 1;
        }
    }

}
int isit(char*s,char*t,int fir){
    int i;
    for(i=fir;i<i+strlen(t)-1;i++)
        if(t[i]!=s[i] && t[i]!='?')
            return -1;
    return 1;
}

2 个答案:

答案 0 :(得分:5)

在其他问题中,函数isit不使用t的正确索引。用指针编写它会更简单,并且应该返回布尔值01

int isit(const char *s, const char *t, int first) {
    for (s += first; *t; s++, t++) {
        if (!*s || (*s != *t && *t != '?'))
            return 0;
    }
    return 1;
}

还使用更一致的间距和更明确的变量名称:如果函数很短且名称是惯用的,则1个字母的局部变量名称是正确的(i表示索引,s表示char * 1}} ...),但愚蠢的缩写不是(fir的{​​{1}})。函数名first没有关于它的作用的信息!事实上,你甚至不需要一个函数,你可以使用标准函数:

isit

编辑:但正如M.Ohhm所说,这不会处理strncmp(s + first, t, strlen(t)) == 0 通配符。

答案 1 :(得分:3)

问题出在函数isit()

1)在isit()中检查字符串时。 ts的索引必须不同。对于s,它必须从fir开始,但对于t,它必须从0开始。

2)您不需要在终止条件检查中执行-1,因为您已经在使用<,而不是<=

3)您需要将终止条件更改为i<fir+strlen(t),因为i在每次迭代时都在变化,这会使终止条件无效

将代码更改为

int isit(char*s,char*t,int fir){
    int i, j;
    for(i=fir, j=0; i<fir+strlen(t); i++, j++)
        if(t[j]!=s[i] && t[j]!='?')
            return -1;
    return 1;
    }