K&R 2 第 5.10 节中的说明

标签 c kernighan-and-ritchie

如果输入是查找模式,模式识别程序必须打印包含该模式的所有行。如果输入是 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/

相关文章:

c - 在 c 程序中运行 shell 命令

c - : type_a sample; type_b *sample_b = (type_b *) ((void*) &sample); 中的无关(void *)

c - pthread_cond_wait 期间 SIGINT 的 Valgrind 错误

c - 我不明白 K&R 中的哈希表示例

c - read() 的输出没有合并到 getchar 中

c - mac osx 终端中的信号 EOF

c++ - 发送一行二维数组作为参数

c - 写了一段代码,但是有一些错误

c - 日期时间作为键

c - K&R 书末描述的存储分配器中的 "space itself"在哪里?