【问题标题】:Is one string located inside the other?一根弦位于另一根弦内吗?
【发布时间】:2015-10-31 09:54:24
【问题描述】:

用户给我们更长的字符串s和更短的t

如果ts 中,其中? 字符串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;
}

【问题讨论】:

  • 不要使用gets(),它已被弃用。请改用fgets()。顺便说一句,问题是什么?
  • 如果s='straga' and t='aga',那么t位于s中,应该显示确认
  • @Desperado 你遇到了什么问题?
  • 添加到@Haris 的评论:永远不要使用gets()!它不仅已被弃用,而且出于strong 的原因而被弃用——它最终会溢出任何 缓冲区,因此存在安全风险。
  • @sureshkumar 这正是我的第一个想法,但请阅读问题:它不符合要求,因为为任何字符定义了一个占位符。

标签: c string function


【解决方案1】:

除其他问题外,函数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 *... ),但愚蠢的缩写不是(fir 代表first)。函数名称isit 没有关于它的作用的信息!事实上,您甚至不需要函数,您可以为此使用标准函数:

strncmp(s + first, t, strlen(t)) == 0

编辑:但正如 M.Oehm 所指出的,这不会处理 ? 通配符。

【讨论】:

  • 当然,strncmp 不会按需要处理 ? 通配符。否则,合理的建议。
【解决方案2】:

问题出在函数isit()


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

2) 你不需要在终止条件检查中做-1,因为你已经在使用&lt;,而不是&lt;=

3) 您需要将终止条件更改为i&lt;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;
    }

【讨论】:

  • @ameyCU,Np,你来自哪所大学,我看到你来自印度。
  • 在 main() 中的 FOR 之后修复并添加了 printf("it's not located"),它给了我“它没有找到”。
  • 我无法说服自己停止条件是i&lt;i+strlen(t)。如果 ts 相同,会发生什么?此停止条件将不会被激活,并且将尝试读取通过数组的末尾t,具有潜在的未定义行为...i&lt;fir+strlen(t) 会不会更好?
  • @francis,在阅读您的评论之前,我刚刚测试并进行了相同的更改。 :)
  • @Desperado,经过测试和编辑,现在可以使用。完成更改。
猜你喜欢
  • 2015-07-21
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多