所以我才知道我们可以在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的个元素argv上stdout.
是
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)