当strncmp()和check()都返回0时,我希望循环退出,这意味着它们都找到了匹配项。问题是,当check()返回0并且strncmp()没有返回0时,循环正在退出。
while (strncmp(buf, match, 3) != 0 && check(buf[3]) != 0)
{
}
我已经检查了buf和match中的值,并且它们在退出时不匹配。 buf [3]在退出时确实匹配。
答案 0 :(得分:8)
您正在使用&&
,因此您要说必须满足strncmp(buf, match, 3)
和 check(buf[3]) != 0
才能进行循环接着说。要获得您指定的结果,您应该使用||
答案 1 :(得分:3)
此循环与
一样长buf
和match
在前3个字符的某处有所不同, AND check(buf[3])
非零这就是你想要的吗?换句话说,当
时,循环退出buf
和match
共享相同的三个首字母 OR check(buf[3])
为零我希望在strncmp()和check()都返回0
时退出循环
然后你可以根据你的要求重写循环以便很容易地验证:
for(;;) {
...
if (strncmp(buf, match, 3) == 0 && check(buf[3]) == 0)
break;
...
}
现在将否定条件放在循环的控制表达式中:
while (! (strncmp(buf, match, 3) == 0 && check(buf[3]) == 0) ) {
...
}
如果你有点涉及计算机科学,你会发现not(A and B)
是 - de Morgan's Laws - 相当于(not A) or (not B)
。这终于产生了:
while (strncmp(buf, match, 3) != 0 || check(buf[3]) != 0) {
}
因此,您的错误是使用&&
而不是||
作为逻辑运算符。
答案 2 :(得分:2)
int c,d;
while ((c=strncmp(buf, match, 3) != 0) && (d=check(buf[3]) != 0))
{}
说明
strncmp()将返回一个必须存储在var中的值。如果不这样做,它将如何与0..same进行比较以及check()。