如何在内部处理argv?

时间:2014-09-09 05:32:11

标签: c

以下是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[]中的指针数组在内部处理为字符串常量的指针,指向多个数组的指针,每个数组包含一个字符串,或指向单个数组中不同点的指针,一个数组包含所有的字符串? 我真的只需要一句话答案。

2 个答案:

答案 0 :(得分:3)

一句话:它完全取决于

扩展:如果实现遵循标准中规定的规则,则可以自由地安排实际的字符数组,但它认为合适。

argv中的指针必须是连续的(并且argv[argc]必须是NULL),但它们指向的字符数组可以遍布整个地方,条件是每个参数都有连续的字符和空终止符。

所以,可能是:

argc == 2
+---------+---------+---------+
| argv[0] | argv[1] | argv[2] | --+
+---------+---------+---------+   |
  |            |                  V
  |            +-----------+     NULL
  |                        |
  V                        V
+---+---+---+---+---+----+---+---+----+
| s | l | e | e | p | \0 | 6 | 0 | \0 |
+---+---+---+---+---+----+---+---+----+

或同样有效:

argc == 2
+---------+---------+---------+
| argv[0] | argv[1] | argv[2] | ------------+
+---------+---------+---------+             |
  |            |                            V
  |            +------------------------+  NULL
  |                                     |
  V                                     V
+---+---+---+---+---+----+ (any old   +---+---+----+
| s | l | e | e | p | \0 |  rubbish   | 6 | 0 | \0 |
+---+---+---+---+---+----+     here)  +---+---+----+

答案 1 :(得分:2)

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