[嵌入式 C 语言] int main(int argc, char *argv[])

一、含义 

        在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 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值