下面是K&R中描述命令行参数的一些代码

int getline(char *s, int lim)
{
    int i = 0;

    while(i < lim - 1 && (*s = getchar()) != EOF && *s++ != '\n')
       i++;

    if(*s == '\n')
      *s++ = '\n', i++;

    *s = '\0';
    return i;
}

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++;
             }
         }

     printf("Found: %d", found);
     return found;
}

这里还有一个问题涉及到这个问题,但有一些事情我仍然不清楚。
首先,*argv[]中的指针数组是否作为指向字符串常量的指针、指向多个数组的指针(每个数组都包含一个字符串)或指向单个数组中不同点的指针(包含所有字符串的数组)在内部处理?我真的只需要一句话来回答这个问题。

最佳答案

字符串不是字符串常量,但可以将它们视为指向多个数组的指针,每个数组都包含一个字符串,也可以将它们视为指向包含所有字符串的单个数组中的不同点的指针;在Unix上的典型实现是,您无法区分这两者之间的区别,但其他实现可能会以不同的方式对数据进行布局,因为标准只需要一个“仿佛”的实现,该实现的行为如标准所述(其中的相关章节是第5.1.2.2.1节“程序启动”),所有这些都是满足问题要求的一句话。

08-19 18:26