用户为我们提供更长的字符串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;
}
答案 0 :(得分:5)
在其他问题中,函数isit
不使用t
的正确索引。用指针编写它会更简单,并且应该返回布尔值0
或1
:
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()
中检查字符串时。 t
和s
的索引必须不同。对于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;
}