在字符串中查找子字符串

时间:2013-05-13 01:59:22

标签: c string

这是我的代码,用于查找用户在给定字符串中输入的子字符串。

bool find_str(char *str, char const *substr) {
    while(*str) {
        if(*str++ == *substr) {
            char const *a = substr;
            while((*str++ == *++a));  /*empty*/
            if(*a == '\0')
                return true;
        }
    }
    return false;
}
// If match found, then return true, else false

int main(void) {
  printf("%d", find_str("ABCDEF", "CDE"));  /* Return true in this case */
  printf("%d", find_str("ABCDE", "CDE")); /* Return false in this case */

}

正如评论中所解释的那样,只要它以一个附加字符结束,它就会返回true。如果不是,则返回false。我认为增量/减量运算符存在问题。但我找不到怎么样?

2 个答案:

答案 0 :(得分:4)

这是因为您的代码决定在执行比较后停止仅查找\0

*str++ == *++a

即使匹配发生在空终止符的字符串末尾,这个条件也是true,所以while循环会很快地超出两个字符串的末尾超过null终止符,导致未定义的行为。

*a为零时,将条件更改为退出应解决问题:

while((*str++ == *++a) && (*a));

答案 1 :(得分:1)

根据我的分析,我分析了一段代码, 我认为问题出在这里

        while((*str++ == *++a));    /*empty*/

也许您想添加另一个声明,如下面的

while((*str++ == *++a) && ( *a != '\0' ) ) ;    /*empty*/

我猜你错过了一个空检查,如果两个指针都指向NULL终止,那么它们仍将继续前进,这正是发生的事情

我正在浏览你的代码,发现了很多有趣的东西

  1. 假设为CDE分配的内存为X
  2. 再次说出为ABCDEF分配的内存为X + 4(我的机器就是这种情况)
  3. 并说为ABCDE分配的内存块是在某个X + Y或者什么
  4. 现在第二次调用该函数时 指针a和str都指向从X + 2开始的各个存储位置,其中字符C满足上述条件,但是即使它们到达结束,即在X + 3处,条件仍将为真,因此a将向前移动并指向A会使您的程序出现错误行为