如果输入是查找模式,模式识别程序必须打印包含该模式的所有行。如果输入是 find -x pattern,程序必须打印除包含 pattern 的行之外的所有行。
// .....
switch(c)
{
case 'x':
except=1;
break;
// ......
}
// ......
while(getline(line,MAXLINE)>0)
{
line_num++;
if( (strstr(line,*argv)!=NULL) != except)
{
if(number)
printf("%ld:",linenum);
printf("%s",line);
found++;
}
}
// ......
在上面来自 K&R 的代码中,except 可以是 1 或 0。if(strstr...)
block 如何有效地处理 -x?
最佳答案
逻辑很简单。如果模式是 "-x"
,我们应该打印所有不包含该模式的行。
对于此模式,except
等于 1
。
所以包含模式的行满足条件
strstr(line,*argv)!=NULL
也就是说,如果一行包含该模式,则此条件将始终等于 1。
因此,如果 except
等于 1 并且条件 strstr(line,*argv)!=NULL
等于 1,我们应该跳过该模式。
否则,如果条件 strstr(line,*argv)!=NULL
不等于 1,即未找到模式则执行 if 语句
if( (strstr(line,*argv)!=NULL) != except)
返回 true 并执行其复合语句。
另一方面,如果 except
等于 0
那么要实现 if 语句中的条件将评估为真,我们需要条件 strstr (line,*argv)!=NULL
将等于 1。
其实你可以重写if语句
if( (strstr(line,*argv)!=NULL) != except)
以下方式
if( ( ( strstr(line,*argv) != NULL ) == 1 && except == 0 ) ||
( ( strstr(line,*argv) != NULL ) == 0 && except == 1 ) )
简而言之,if 语句在任何情况下都起作用
1 and 0
或
0 and 1
如果是
1 and 1
或
0 and 0
那么if语句就不会被执行
这里的 1 和 0 是 if 语句中两个子表达式的求值结果。
关于K&R 2 第 5.10 节中的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35079416/