当满足1个条件时,退出2个条件

时间:2015-11-27 16:20:50

标签: c

当strncmp()和check()都返回0时,我希望循环退出,这意味着它们都找到了匹配项。问题是,当check()返回0并且strncmp()没有返回0时,循环正在退出。

while (strncmp(buf, match, 3) != 0 && check(buf[3]) != 0)
{
}

我已经检查了buf和match中的值,并且它们在退出时不匹配。 buf [3]在退出时确实匹配。

3 个答案:

答案 0 :(得分:8)

您正在使用&&,因此您要说必须满足strncmp(buf, match, 3) check(buf[3]) != 0才能进行循环接着说。要获得您指定的结果,您应该使用||

答案 1 :(得分:3)

此循环与

一样长
  1. bufmatch在前3个字符的某处有所不同, AND
  2. check(buf[3])非零
  3. 这就是你想要的吗?换句话说,当

    时,循环退出
    1. bufmatch共享相同的三个首字母 OR
    2. check(buf[3])为零
    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()。