这是我的代码,用于查找用户在给定字符串中输入的子字符串。
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。我认为增量/减量运算符存在问题。但我找不到怎么样?
答案 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终止,那么它们仍将继续前进,这正是发生的事情
我正在浏览你的代码,发现了很多有趣的东西
现在第二次调用该函数时 指针a和str都指向从X + 2开始的各个存储位置,其中字符C满足上述条件,但是即使它们到达结束,即在X + 3处,条件仍将为真,因此a将向前移动并指向A会使您的程序出现错误行为