18

C语言怎样传递main()函数的两个参数

 3 years ago
source link: https://blog.popkx.com/c%E8%AF%AD%E8%A8%80%E6%80%8E%E6%A0%B7%E4%BC%A0%E9%80%92main%E5%87%BD%E6%95%B0%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%8F%82%E6%95%B0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C语言怎样传递main()函数的两个参数

发表于 2019-07-15 08:07:09   |   已被 访问: 415 次   |   分类于:   C语言   |   暂无评论

了解了这一点,再看下面这段C语言代码就不难了。

C语言程序的入口函数默认是 main() 函数,它的一个C语言标准原型是下面这样的,请看:

int main(int argc, char *argv[]);

main() 函数的两个参数允许用户执行应用程序时指定参数。编写 myprint() 函数打印 main() 函数接收到的参数,并在 main() 函数中调用,相关C语言代码如下,请看:

void myprint(int argc, char *argv[])
{
    int i;
    for(i=0; i<argc; i++){
        printf("argv[%d]: %s\n", i, argv[i]);
    }
}
int main(int argc, char *argv[])
{
    myprint(argc, argv);
    return 0:
}
50d8a1e75f3c0d081c77cca160c4273b.png

编译这段C语言代码,可得到可执行文件,在执行时指定参数,可以得到如下输出:
# gcc t.c
# ./a.out 
argv[0]: ./a.out
# ./a.out hello world
argv[0]: ./a.out
argv[1]: hello
argv[2]: world

允许 main() 函数接收参数很有用,因为程序可以根据不同的输入进行不同的处理,更加灵活适用。事实上,有些标准库就是专门用来解析 main() 函数接收到的参数的,例如 getopt 库(不是本节重点,以后再说)。

实际的C语言程序中,可能不仅仅是 main() 函数,在程序执行过程中也常会允许用户输入命令。要实现这一过程,比较常用的方法是让用户输入一段字符串,然后从中解析出相应的命令。例如要将地址 0x8000 处的值设置为 0x33,用户输入如下命令:

# setvalue --address=0x8000 --value=0x33 

要解析这段字符串中有用的信息,可以使用 getopt() 库(当然也可以自己造轮子,但是既然有现车的轮子,为何不直接使用呢)。但是,getopt() 的C语言原型是下面这样的:

int getopt(int argc, char * const argv[],
                  const char *optstring);

要使用它,需要将上述字符串切割成下面这样的若干子字符串:

"setvalue"
"--address=0x8000"
"--value=0x33"

这样的需求并不困难,但是有一点需要确定,我们应该定义怎样的数据结构存储这些子字符串呢?要知道,用户可不会一直按照标准要求去使用程序,他可能输入任意多,任意长的参数。

读者可能会觉得根据参数长度进行动态内存分配比较合适,这样无论用户如何输入,C语言程序总是能够自我调整,分配一段足够大的内存供存储使用。但是如果用户恶意使用,这种做法其实是不安全的,毕竟内存总是有限的。另外,频繁的动态内存分配与释放也比较麻烦。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK