4

我找到了这个功能,但我不明白它的某些部分。我有大约 3 天的 C 经验,所以请耐心等待。此函数用于解析命令行参数。

  1. 为什么他们重​​新分配*arg*c

  2. 我不明白他们为什么要运行一个while循环。

  3. 其次,他们为什么要针对 char 指针运行 while 循环?我知道 char 实际上是一个字符数组,但我的理解是他们只会对 char 运行一个 while 循环,即单独访问数组字符值,而他们不会做任何事情。

  4. 你怎么能增加一个字符?

  5. 为什么我们甚至有 *c?

  6. 我添加了字符串检查以查看 arg 是否是-styles例如,它有一个-所以我可以解析标志并获取值,它是下一个 arg argv— 使用正确吗?

就像我说的,我有大约 3 天的 C 经验,所以请彻底、有条不紊,并尽可能帮助我更好地理解这个函数和 C 整体。

void print_args(int argc,char *argv[])
{
     int i;
     if(argc > 1){
       for(i=1;i<argc;i++){
           char *arg = argv[i];
           char *c = arg;
           while(*c){
             if(strchr("-", *c)){
                 printf("arg %d: %s -> %s\n",i,arg,argv[i+1]);
             }  
             c++;
         }
       }
     }
 }
4

4 回答 4

2

1)arg赋值为指向当前char数组的头部,c用于遍历数组。

2,3,5) while 循环一直运行,直到c指向(char)0,顺便说一下 也是\0。所以实际上它们遍历了 char 数组中的每个字符,直到它们到达空终止符。一个更好的条件应该是while (*c != '\0'),而不是隐含地依赖'\0' == 0

4) 他们增加一个指针,从而让它指向下一个存储单元,即下一个数组单元。

6)您的添加将作为识别选项的测试,您仍然需要将其与它进行比较-styles以查看它确实是一个有效的选项。

此代码示例可以进行大量修复以使其更加健壮和清晰。如果这是来自一本书或 C 教程,我建议你寻找另一个。

于 2012-11-24T23:58:12.937 回答
1

我变成了一个什么都不包含的程序的函数并运行它print_argsmain这就是它的作用:

$ ./a.out a ab abc abcd
arg 1: a -> ab
arg 2: ab -> abc
arg 2: ab -> abc
arg 3: abc -> abcd
arg 3: abc -> abcd
arg 3: abc -> abcd
arg 4: abcd -> (null)
arg 4: abcd -> (null)
arg 4: abcd -> (null)
arg 4: abcd -> (null)

换句话说,对于每个命令行参数的每个字符,它都会打印整个命令行参数、一个细箭头和下一个命令行参数。(如果我的 C 库对 不满意printf("%s", (char *)NULL),它会在它结束时崩溃。)打印整个命令行参数是它需要c和的原因arg,尽管该行完全可以读取

printf("arg %d: %s -> %s\n", i, argv[i], argv[i+1]);

然后arg就没有必要了。

你的猜测和我的猜测一样好,为什么这个函数会做这个特定的事情。对我来说,这似乎不是一件特别有用的事情。

编辑:如果您的目标是打印argv[i]并且无论argv[i+1]何时argv[i]以破折号开头并且argv[i+1]不为NULL(这在上下文中可能实际上是有意义的),那么您应该这样写:

void
print_args(int argc, const char *const *argv)
{
    int i;
    for (i = 0; i < argc; i++)
        if (argv[i][0] == '-' && argv[i+1])
            printf("arg %d: %s -> %s\n", i, argv[i], argv[i+1]);
}

如果您想在argv[i] 包含破折号时打印,请替换

argv[i][0] == '-'

strchr(argv[i], '-')

在 if 语句中。

附录:我强烈建议您阅读http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html,它描述了现代 UNIX 命令行程序应该如何解释它们的参数。

于 2012-11-25T00:08:04.313 回答
1

代码所做的大多数单独的事情都可以单独进行,但是while对字符进行循环arg是很奇怪的。这类似于“为 arg 中的每个破折号打印 arg 和下一个 arg”。但我怀疑是否有人真的想要那样。

于 2012-11-25T00:01:50.313 回答
0

当您增加一个指针时,您将转到该指针之后的下一个地址。因此,假设您在地址 0000,下一个地址是 0004、0008 等。例如,该地址的值可以是字符串中的一个字符。所以如果字符串是“hello”,那么*c就是“h”,第一个*c++就是“e”。

while 循环通常不是最有效的处理方式,因为您很容易陷入无限循环。这是为了确保字符串中的每个字符都已被考虑在内。

我不完全确定他们为什么将 arg 分配给 *c。

于 2012-11-24T23:57:03.357 回答