C程序起点main函数

main

c语言中main函数接收两个参数int argc, char* argv[]

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

如上,argc代表参数的数量,argv但是参数字符串指针数组

./program -i 192.168.0.1 -p 2000

此时共有五个参数,

argv[0] --> ./program
argv[1] --> -i
argv[2] --> 192.168.0.1
argv[3] --> -p
argv[4] --> 2000

短选项接收

那么我们怎么去接收这些参数并去识别,那么就要用到getopt.hgetopt()函数了。

int getopt(int argc, char** argv, char* optstring);

第一个参数、第二个参数对应即可,第三个参数接收的是选项如"i:p:"ip代表选项,:代表其后接收一个参数。每个选项例如"-i"这个函数会直接过滤掉-,每次获取时会自动将:后的参数传入到optarg,下次获取会直接跳到下一个选项。此函数的返回值为选项'i'ASCII码值。optind表示的是经过了多少个元素(包括参数和选项)。

实例

int main(int argc,  int char){
// 判断参数
if(argc < 5) return -1;
int ret = 0;
char* ip =NULL;
int port = 0; // i,p表示两个命令,:表示需要一个参数
while ((ret = getopt(argc, argv, "i:p:")) != EOF){
// printf("char is %c\n", ret);
switch (ret)
{
case 'i':
// printf("optarg: %s\n", optarg);
ip = optarg;
break;
case 'p':
// printf("optarg: %s\n", optarg);
port = atoi(optarg);
break;
default:
break;
}
}
printf("ip: %s, port: %d\n", ip, port);
return 0;
}

长选项接收

如果有长命令的输入需求的话,可以使用getopt_long函数和getopt_long_only函数

int getopt_long (int argc, char ** argv, const char *shortopts, const struct option *longopts, int *longind);
int getopt_long_only (int argc, char ** argv, const char *shortopts, const struct option *longopts, int *longind);

这两个函数的区别是后者会将---都解释为长命令,前者只会认为-是短命令。值得一提的是,这两个函数的返回值都是结构体中定义的长命令的返回值。longid指向的是每一个选项的位置。

长选项结构体

struct option {
char* name; // 选项名字
int has_args; // 是否有参,有三个宏定义
int* flag; // 为0代表,返回值是常量,如果非0,返回值是一个变量
int val; // 返回值
};

实例

#include <getopt.h>
#include <stdio.h> // ./test --dmac 00:0c:6e:bb:bc:a7 --sip 192.168.3.105 --dip 192.168.3.102 --sport 8000 --dport 2000
int main(int argc, char *argv[])
{
if (argc < 11)
{
return -1;
}
while (1)
{
int long_index = 0;
static struct option long_options[] = {
{"dmac", required_argument, 0, 0},
{"sip", required_argument, 0, 1},
{"dip", required_argument, 0, 2},
{"sport", required_argument, 0, 3},
{"dport", required_argument, 0, 4},
{0, 0, 0, 0}};
int c = 0;
c = getopt_long_only(argc, argv, "", long_options, &long_index);
if (c == -1)
{
break;
}
switch (c)
{
case 0:
printf("option %s", long_options[long_index].name);
if (optarg)
printf(" with arg %s", optarg);
printf("\n");
break;
case 1:
printf("option %s", long_options[long_index].name);
if (optarg)
printf(" with arg %s", optarg);
printf("\n");
break;
case 2:
printf("option %s", long_options[long_index].name);
if (optarg)
printf(" with arg %s", optarg);
printf("\n");
break;
case 3:
printf("option %s", long_options[long_index].name);
if (optarg)
printf(" with arg %s", optarg);
printf("\n");
break;
case 4:
printf("option %s", long_options[long_index].name);
if (optarg)
printf(" with arg %s", optarg);
printf("\n");
break;
default:
break;
}
}
}

C程序起点main函数的更多相关文章

  1. (转)Java程序利用main函数中args参数实现参数的传递

    Java程序利用main函数中args参数实现参数的传递 1.运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,J ...

  2. 【转载】linux操作系统与应用程序的main函数

    来源:https://blog.csdn.net/h542723151/article/details/52154871 这几天一直在纠结: main函数是程序的入口,一个程序启动后,经过bootlo ...

  3. TCP回射客户程序:main函数

    创建套接字,装填网际网套接字地址结构 创建一个TCP套接字,用服务器的IP地址和端口号装填一个网际网套接字地址结构 我们可从命令行参数取得服务器的IP地址 从头文件unp.h取得服务器的众所周知端口号 ...

  4. TCP回射服务器程序:main函数

    TCP回射并发服务器 1.创建套接字,绑定服务器的众所周知端口 创建一个TCP套接字,在待绑定到该TCP套接字的网际网套接字地址结构中填入通配地址(INADDR_ANY) 和服务器的众所知周(SERV ...

  5. 控制台应用程序中Main函数的args参数

    在VS中添加参数 菜单   项目   --   你的项目属性   --   调试   --   启动选项   --   命令行参数 参数之间用空格分隔开就可以了,如果参数有空格,以双引号风格

  6. 如何写好 C语言 main 函数!你准备好编写 C 程序了吗?

    学习如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数.   我知道,现在孩子们用 Python 和 JavaScript 编写他们的疯狂"应用程序".但是 ...

  7. 为什么需要main函数,及其参数的用法

    首先,需要明确main函数是什么? 答:main函数是C语言约定的入口函数 C99标准里面是这样描述的: Program startup The function called at program ...

  8. main()函数的输入参数 main(int argc, char** argv)

    一般简单的C++程序,main函数的写法都是 int main() {... ; return 0;},但是,如果在运行程序时需要有参数输入,可以是使用将主函数写成int main(int argv, ...

  9. node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...

  10. main函数之后的调用

    main函数代表进程的主线程.程序开始执行时,系统为程序创建一个进程,main函数其实并不是首先被调用的函数,而是操作系统调用了C/C++运行期启动函数,该函数负责对C/C++ 运行期库进行初始化.它 ...

随机推荐

  1. 记录.Net部署Docker-v指令使用

    记录Docker的-v指令使用 前言 之前我浅学了一下docker,方便部署.net项目(部署的是打包之后的项目) dockerfile文件如下: FROM mcr.microsoft.com/dot ...

  2. Docker部署JavaWeb项目(Tomcat环境)

    一.环境准备 1.首先准备一台Centos 7的虚拟机并安装Docker. 2.准备好Tomcat.JDK的安装包以及该java项目的war包. 二.编写Dockerfile Dockerfile是一 ...

  3. go语言的基础语法

    字符串数组 package main import ( "fmt" ) func main() { var str string str = "hello world&q ...

  4. SafeLine Web 安全网关保护你的网站不受黑客攻击

    SafeLine 简介 今天,推荐给大家的是一款在社区广受好评的网站防护工具 -- SafeLine Web 安全网关. 简单来说这是一个自带安全 buf 的 Nginx,它基于业界领先的语义分析检测 ...

  5. 也说一说IDEA热部署Web项目最终解决方案,确实大大提高工作效率

    热部署就是正在运行状态的应用,修改了它的源码之后,在不重新启动的情况下能够自动把增量内容编译并部署到服务器上,使得修改立即生效.热部署为了解决的问题有两个: 1.在开发的时候,修改代码后不需要重启应用 ...

  6. 解决方案 | 将时间转换为毫秒bat

    @echo off setlocal enabledelayedexpansion rem 输入的时间 set "time_input=00:07:07.1" rem 解析时间 f ...

  7. MySQL索引是怎么支撑千万级表的快速查找?

    前言 在 MySQL 官方提到,改善操作性能的最佳方法 SELECT 在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配 ...

  8. oeasy教您玩转vim - 34 - # 查找进阶

    ​ 查找进阶 回忆上节课内容 上次是搜索,是全文搜索 和我们以前的行内有点像 / 正向,? 反向 n 保持方向,N 改变方向 hls 让搜索结果高亮 wrapscan 可以从头搜索 noh 取消本次高 ...

  9. SQL分析“聚集索引、非聚集索引”区别

    概述 聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序,因此一 ...

  10. 前端说你的API接口太慢了,怎么办?

    当有千万条海量数据时,前端调取接口发现接口响应的太慢,前端这时让你优化一下接口,你说有几千万条数据,觉得自己尽力了,前端觉得你好菜,别急,读完这篇文章,让前端喊你一声:大佬,厉害!!! 常用的方法总结 ...