【发布时间】:2016-02-22 03:39:05
【问题描述】:
如何读取 C 中的命令行参数?例如,在
./test --help
或
./test --build
如何访问“--build”或“--help”?
【问题讨论】:
-
命令行参数是主函数的一部分。
标签: c parameters
如何读取 C 中的命令行参数?例如,在
./test --help
或
./test --build
如何访问“--build”或“--help”?
【问题讨论】:
标签: c parameters
您的参数在 argv 中:
int main(int argc, char **argv)
如果你打印 argv 的内容(argv[0]、argv[1] 等),你就会明白了。
尝试:
int main (int argc, char **argv)
{
for(int i = 0;i< argc;i++)
printf("%s\r\n",argv[i]);
}
【讨论】:
您可以将argc 和argv 参数用于main 函数,并根据它们做不同的事情:
#include <string.h>
void dohelp(void) { /* whatever; */ }
void dobuild(void) { /* whatever; */ }
int main(int argc, char **argv) {
if (argc == 2) {
if (!strcmp(argv[1], "--help")) dohelp();
if (!strcmp(argv[1], "--build")) dobuild();
}
return 0;
}
argc 包含由 shell 传递给程序的参数数量,包括程序名称。所以myapp --help 的 argc 为 2。
argv 是参数本身。最后一个 argv (argv[argc]) 是 NULL 指针。
编辑:参数不需要命名为argc 和argv,但是命名其他的东西非常非常不好!
int main(int foo, char **bar) /* RGAGGGGHH */
int main(int n, char **options) /* RGAGGGGHH */
【讨论】:
! 以使其匹配
/* RGAGGGGHH */ 不要犹豫。告诉我们您真正的想法。
strcmp() 的声明位于 string.h。 stdio.h 恰好包含 string.h。包含string.h 和stdio.h 并没有什么坏处,但我会这样做。
最基本的是使用参数(int argc, char *argv[]),你可以直接解析。
一种更高级的方法是使用getopt...http://www.gnu.org/s/libc/manual/html_node/Getopt.html
【讨论】:
命令行参数是通过名称传递给程序的参数。例如,UNIX 程序 cp(复制两个文件)具有以下命令行参数:
cp SOURCE DEST
您可以使用argc 和argv 访问命令行参数:
int main(int argc, char *argv[])
{
return 0;
}
argc 是参数的数量,包括程序名称,而 argv 是包含参数的字符串数组。 argv[0]是程序名,argv[argc]保证是NULL指针。
所以cp 程序可以这样实现:
int main(int argc, char *argv[])
{
char *src = argv[1];
char *dest = argv[2];
cpy(dest, src);
}
它们不必命名为argc 和argv;他们可以有任何你想要的名字,尽管传统上他们是这样称呼的。
【讨论】:
[像往常一样]有几种方法可以做到这一点。 从 argv 读取命令行参数(与 argc 一起传递给 main)。
您可以自己解析这些,并在每次在 argv 中找到新选项时进行位开关设置标志。或者您可以使用库来解析命令行参数。我建议使用 libc getopt(谷歌搜索)。
【讨论】: