如何从C中的main函数打印argv参数?

11 c printf parameter-passing

所以我才知道我们可以在main函数中给出两个参数,即"argc"和"argv.但是我无法理解argv在这里是什么: int main(int argc, char* argv[]);

argv是一个字符数组?还是指向字符的指针数组?无论哪种方式,我正在寻找一种方法来打印出用户传递给该程序的参数.这是我写的代码,但它不是打印argv的.这有什么不对?我想这是我对argv的理解,这使得这段代码不正确.

#include<stdio.h>
int main(int argc, char *argv[])
{
    int i;
    printf("%d\n",argc);
    for(i=0;i<argc-1;i++)
    {
        printf("%s",*argv[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我从答案得到的建议后,我更正了我的代码如下.

#include<stdio.h>
int main(int argc, char *argv[])
{
    int i;
    printf("%d\n",argc);
    for(i=1;i<argc;i++)
    {
        printf("%s",argv[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在Windows 8.1上使用VMWare中的Ubuntu Linux.这是我得到的输出.它只是打印argc,之后什么都没有.有什么问题?这是我在Linux终端中编译它的方式吗?

我终端的快照

在上图中,我希望再次打印数字2,4,5,3,但它们不会被打印出来.

谢谢.

344*_*442 11

让我们一步一步地解释一下.首先,当你通过调用类似的东西来调用你的程序时......

./my-program arg0 arg1 arg2
Run Code Online (Sandbox Code Playgroud)

你传递了一系列三个论点,对吧?每个参数都是一个字符串,对吗?现在,该main函数可以有两个原型中的一个,如C标准所规定的......

int main(); // Let's not worry about this for now
int main(int argc, char **argv);
Run Code Online (Sandbox Code Playgroud)

我们的想法是main能够处理您提供的参数.argc提供参数的数量.如果你注意到,在传递三个参数时,argc是4!发生这种情况是因为第一个参数在所有其他参数之前传递./my-program,并让您的程序识别自己.

现在,char **argv意味着什么?表格的某些东西X*是指针X,对吗?所以,char *是指向的指针char,并且char **是指向指针的指针char.在C中,字符串只是一个以零结尾的数组char,并且数组可以"降级"为指针.这意味着它argv是一个字符串数组,第一个字符串argv[0]是程序的名称.

现在,C标准允许您编写任何"兼容"原型main.例如,你可以写任何这些......

int main(int argc, const char *const argv[]);
int main(int argc, const char *argv[])
int main(int argc, const char **argv);
int main(int argc, const char *const *const argv);
Run Code Online (Sandbox Code Playgroud)

你不需要理解它们现在的意思,只是这argv是一个字符串数组,并且你永远不应该修改字符串,因为原始的main原型似乎信任你.现在,知道参数开始argv[1],你的代码......

for(i=0;i<argc-1;i++)
Run Code Online (Sandbox Code Playgroud)

意思是:"每个i范围为0到argc - 1".

    printf("%s",*argv[i]);
Run Code Online (Sandbox Code Playgroud)

意思是:"打印第一个i元素的第一个字符argv".为什么这会错?首先,你打印一个char,并告诉printf它是一个字符串.这有未定义的行为.然后,你将迭代第一个i元素argv.这意味着第一个"非参数"元素将包含在混合中,而最后一个参数将不包括在内.为了解决它,写一些像...

for(i = 1; i < argc; i++)
Run Code Online (Sandbox Code Playgroud)

意思是:"每个i范围从1最高到argc".

    printf("%s", argv[i]);
Run Code Online (Sandbox Code Playgroud)

意思是:"打印i的个元素argvstdout.

  • Sry,但是这个"*这意味着argv是一个字符串数组*"(至少从有些误导性的上下文中取出)根本就是错误的.`argv`是指向`char`-pointers指针数组的第一个元素的指针.随后引用`char`-arrays,C-"strings"."*字符串数组*"肯定是不同的(例如`char [47] [11]`). (2认同)

hac*_*cks 5

argv一个字符数组?还是指向字符的指针数组?

argv是指向指针的指针char.当通过命令行传递参数列表时,char将创建一个指针数组,并且每个指针指向这些参数中的每一个,以字符串的形式存储,以及程序名称.argv指向此char *数组的第一个指针.因此,argv[i]是一个指针char.

                           +--------------------------+
              +----+  +--> | argument 1 (program name)|
argv[0]+----> |    |  |    +--------------------------+
              |  +----+
              +----|       +--------------------------+
              |  +-------> |       argument 2         |
              |    |       +--------------------------+
              +----+
              |  +----+    +--------------------------+
              |    |  +--> |       argument 3         |
              +----+       +--------------------------+
           "char *" array
Run Code Online (Sandbox Code Playgroud)

你需要改变

printf("%s",*argv[i]);  
Run Code Online (Sandbox Code Playgroud)

printf("%s",argv[i]);  
Run Code Online (Sandbox Code Playgroud)

*argv[i]是类型的char.%s期待一种类型char *.


小智 5

argv是一个NULL终止的字符串数组。因此,甚至不需要argc打印传递给 main 函数的所有参数。所以 ifargv指向NULLthen 这就是传递的参数的结尾。

总而言之,您可以通过一个简单的while循环来完成此操作,仅使用argv

    while (*argv != NULL)
    {
            printf("%s\n", *argv);
            argv++;
    }
Run Code Online (Sandbox Code Playgroud)