2

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

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。我认为增量/减量运算符存在问题。但我怎么找不到?

4

2 回答 2

4

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

*str++ == *++a

true即使匹配发生在空终止符上的字符串末尾,这种情况也会发生,因此while循环会愉快地继续超出空终止符的两个字符串的末尾,从而导致未定义的行为。

将条件更改为在*a为零时退出应该可以解决问题:

while((*str++ == *++a) && (*a));
于 2013-05-13T02:06:18.330 回答
1

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

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

也许您想添加另一个语句,如下所示

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

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

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

  1. 假设为 CDE 分配的内存位于 X
  2. 再说一遍,分配给 ABCDEF 的内存是 X+4(我的机器就是这种情况)
  3. 并说为 ABCDE 分配的内存块位于某个 X+Y 或任何位置

现在,当第二次调用该函数时,指针 a 和 str 都指向从 X+2 开始的各自内存位置,其中字符 C 满足上述条件,但是即使它们到达终点,即在 X+3 处,条件仍然为真因此 a 将向前移动并指向 A ,这会使您的程序错误地运行

于 2013-05-13T02:32:47.360 回答