在K&R。

#include <stdio.h>
#include <string.h>
#define MAXLINE 1000

int getline(char *line, int max);

int main(int argc, char *argv[])
{

     char line[MAXLINE];
     long lineno = 0;
     int c, except = 0, number = 0, found = 0;

     while(--argc > 0 && (*++argv)[0] == '-')
        while(c = *++argv[0])
          switch(c) {
             case 'x':
                  except = 1;
                  break;
             case 'n':
                  number = 1;
                  break;
             default:
                  printf("find: illegal option %c\n", c);
                  argc = 0;
                  found = -1;
                  break;
          }
    if (argc != 1)
        printf("Usage : find -x, -n, pattern\n");
     else
    while(getline(line, MAXLINE) > 0) {
       lineno++;
        if ((strstr(line, *argv) != NULL) != except) {
           if (number)
              printf("%ld", lineno);
           printf("%s", line);
              found++;
      }
    }
}

我不知道这句话是什么意思:if (strstr(line, *argv) != EOF) != expect)以前有些错误,我改正了。
然而,当我试图理解它时,我遇到了一些麻烦。
这是我的想法:find -x -n。所以,argc = 3argv[0] = findargv[1] = -xargv[2] = -nargv[3] = NULL。在第一个while循环之后,不应该是argc = 0。所以我很困惑。

最佳答案

示例来自K&R第二版第5.10节“命令行参数”。
该示例演示了strstr()、指针处理和向命令行程序添加一些选项:
标准库函数返回指向
字符串strstr(s,t)在字符串t中的第一次出现,或者如果
没有。它在s中声明。
现在可以详细说明该模型以进一步说明
建筑。假设我们要允许两个可选参数。一个
上面写着“打印所有的行,除了那些与模式匹配的行;”
第二句是“在每一行之前加上行号”
回答你关于以下含义的具体问题:

if ((strstr(line, *argv) != NULL) != except)  // note: NULL, not EOF

答案是,如果在行中找到作为命令行参数传递的字符串,则NULL调用将返回非空指针,否则返回空指针。所以子表达式
(strstr(line, *argv) != NULL)

计算结果为:
true    - argument is found (a 'match')
false   - argument is not found (a 'non-match')

变量<string.h>通过具有以下含义的选项设置:
true    - print non-matching lines
false   - print matching lines (the default)

因此,完整表达式根据行是否包含参数以及是否提供打印匹配行或不匹配行的选项来确定是否应打印该行。

关于c - 如何解释此代码:if(strstr(line,* argv)!= EOF)!=除外,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32021417/

10-15 17:55