一、含义
在C语言中,main
函数是程序的起点,也就是执行的入口点。main
函数可以接受命令行参数,并且通常定义如下:
int main(int argc, char *argv[])
-
int argc
: 这个参数代表“参数计数”(Argument Count),表示传递给程序的命令行参数的数量,包括程序本身的名称。例如,如果你的程序名为myprogram
并且你在命令行中输入myprogram arg1 arg2
,那么argc
将为3。 -
char *argv[]
: 这是一个字符指针数组,每个元素指向一个字符串。这些字符串是实际的命令行参数值。argv[0]
通常包含程序的名称(即调用程序的命令),而argv[1]
到argv[argc-1]
包含其他所有参数。继续上面的例子,argv[0]
会是"myprogram"
,argv[1]
会是"arg1"
,argv[2]
会是"arg2"
。
假设我们有一个程序,它的目的是简单地打印出所有传递给它的命令行参数。我们将这个程序命名为
printarg
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
// 打印程序名和所有参数
printf("Program name: %s, Argc num:%d\n", argv[0], argc);
if (argc > 1) {
printf("Arguments passed to the program:\n");
// 遍历所有参数
for (i = 1; i < argc; i++) {
printf("%d: %s\n", i, argv[i]);
}
} else {
printf("No additional arguments provided.\n");
}
return 0;
}
要编译这个程序,你可以使用 gcc:
gcc -o printargs printargs.c
然后,你可以通过命令行传递不同的参数来运行这个程序:
可以看出 argv[0] 存的是文件名字,argv[1] 存的是输入的第一个参数的字符,argv[2] 存的是输入的第二个参数的字符,以此类推。而 argc 就是指参数的个数,只输入./printarg的时候,参数个数就为1了。
还一个问题是我的输出缺少
#
和*8
参数,可能是由于某些特殊字符的处理问题或者环境配置问题。这是因为某些特殊字符可能会被 shell 解析。例如,#
可能会被当作注释符,但通常在命令行参数中不会有问题。*
可能会被 shell 解释为通配符。如果我的目录下有匹配的文件或目录,*
会被展开。
为了排除这些问题,我们可以尝试以下方法:
- 使用引号将特殊字符括起来:
./printarg 1 2 3 arg4 acg5 q '#' '*8'
- 或者使用转义字符
\
来避免特殊字符被 shell 解释:
./printarg 1 2 3 arg4 acg5 q \# \*8
确保这些特殊字符在传递给程序之前没有被 shell 修改或忽略。这样应该能够确保所有参数都被正确地传递给程序。
二、GDB调试
如果我们直接gdb运行这个文件(这里代码和之前一样,只是文件名换了),可以看到程序会一直卡在 The program is not being run. 。这里因为我们是直接运行程序 ./uart_parser ,而没有带任何的参数。在GDB调试中带参数要用 run 命令,如下:
run 1 argc2 等价与 r 1 argc2