main函数参数传递模式

在控制台程序中,参数传递有两种模式:

  1. app.exe -x -n 模式
  2. app.exe -xn 模式

以下程序,可适用与以上两种模式的识别。

#include <stdio.h>
#include <stdlib.h>  //exit()头文件

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

	int c,x_Chosen = 0,n_Chosen = 0;
	bool bRet = true;

	//参数传递模式:*.exe -x -n (或) *.exe -xn均可用
	while(--argc > 0 && (*++argv)[0] == ‘-‘)  //*++argv == argv[1],为char*
		while(c = *++argv[0])  //此时的argv[0]为argv[1][0] == ‘-‘
			switch(c)
		{
			case ‘x‘:
				x_Chosen = 1;
				break;
			case ‘n‘:
				n_Chosen = 1;
				break;
			default:
				printf("find:illegal option %c\n",c);
				argc = 0;
				bRet = false;
				break;
		}

		if(argc == 0)
			printf("-xn后不带参数了\n");
		else if(argc == 1)
			printf("-xn后还带有一个参数\n");
		else
			printf("-xn后还带有不止一个参数\n");

		if(!bRet)
			//Terminate the app
			exit(0);

		return 0;

}

注:*++argv是一个指向参数字符串的指针,因此(*++argv)[0]是它的第一个字符(另一种有效形式是**++argv)。因为[]与操作数的结合优先级比*和++高,所以在上述表达式中必须使用圆括号,否则编译器将会把该表达式当作*++(argv[0])。

当参数较多时,可以采用位运算方法来识别传递进来的参数:

#define PARAM_T (1<<0)  //-t

#define PARAM_X (1<<1)  //-x

#define PARAM_N (1<<2)  //-n

//假设传递 -tx,则:

int nParamTotal = PARAM_T | PARAM_X ;

时间: 2024-11-05 06:30:11

main函数参数传递模式的相关文章

在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。 多线程操作剪切板的时候。

最近做一个蛋疼的东西就是C#调用windows API 来操作一个 软件,自动处理一些东西.要用到剪切板复制 粘贴功能,即 Clipboard.SetDataObject(filedic, true)等. 本来测试的时候,通过主线程 按钮点击开始的时候没有任何问题.但是把整个过程放在一个单独一个线程的时候一到复制的时候就报错, “在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记”.但是查看我的主线程main

选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。

异常: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 只有将调试器附加到该进程才会引发此异常. 方法1: class Program { /// <summary> /// 图片资料文件同步 /// </summary> /// <param name="args"></param> [STAThread] //加这个属性,创建并进入单

【共读Primer】46.[6.3]参数传递--main函数处理参数 Page196

前面所讲到的main函数都是空参数列表的. 相信大家都见过启动程序带的参数,那么这些参数时如何传递进去的. 现在我们来看一下main函数声明的完整形式 int main(int argc, char **argv) { for (int i = 0; i < argc; ++i) { std::cout << "command param " << i << " is :"<< argv[i] <<

《LINUX内核设计的艺术》第一章从开机家电到执行main函数之前的过程 学习笔记之一

从开机加电到实行main函数之前的过程 分为三步,目的是实现从启动盘加载操作系统程序,完成实现main函数的准备工作 启动BLOS,准备是模式下的中断向量表和中断服务程序 从启动盘加载操作系统程序到内存.加载操作系统程序就是靠第一步实现的 为实现32位的main函数做过度工作 1.1启动blos,准备实模式下的中断向量表和中断服务程序 由blos来加载软件操作系统的任务 1.1.1         BLOS的启动原理 0XFFFF0 由硬件来启动,CPU硬件设计逻辑设计为加电瞬间就强行将CS的值

菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是“牛之鼻”,只要能理清main函数,就一定能理解其中的奥秘,下面我们就一起来研究一下nginx的main函数. 1.nginx的main函数解读 nginx启动显然是由main函数驱动的,main函数在在core/nginx.c文件中,其源代码解析如下,涉及到的数据结构在本节仅指出其作用,将在第二节中详细解释. nginx main函数的流程图如下:

linux内核设计的艺术-开始执行main函数

为了执行linux内的C语言main函数,上一篇讲到了,为了从汇编语言环境跳转到C语言环境下执行,将CPU工作模式从16位转变到32位模式(C语言是32位的),并且重新建立了GDT与IDT,但是此时GDT和IDT中并没有内容,所以不能进行内存寻址与中断,接下来就是初始化GDT和IDT了. 进入32位模式后,寄存器也将变为32位寄存器,下面的汇编语法和之前的intel汇编有些不同,为AT&T汇编,至于差别不在赘述. Head.S startup_32: //重设段寄存器内容 movl $0x10,

《Linux内核设计的艺术》学习笔记(一)从开机加电到执行main函数

  实验内核版本:0.11 ◆ 从开机到main函数的三步: ① 启动BIOS,准备实模式下的中断向量表和中断服务程序: ② 从启动盘加载OS程序到内存中,加载OS程序的工作就是利用第一步中的中断服务程序实现的: ③ 为执行保护模式下32位的main函数做过渡工作. ? Intel将所有80x86系列的CPU硬件都设计为加电即进入16位实模式状态运行: ? 将CPU硬件逻辑设计为在加电瞬间强行将CS置为0xFFFF,IP置为0x0000,即是CS:IP指向了0xFFFF0这个地址: 整个过程是一

C++函数参数传递终极版转。

函数调用的作用: ·用实参数向形式参数传递数据: ·为获得数据参数及在函数体中声明的变量分配存储空间: ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数.当参数表为空时,表示该函数不从调用函数接受数据. 函数参数传递机制 堆栈存储区是主调函数(过程)和被调用函数(过程)在调用发生时进行通信的主要区域.  基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value): 被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了 内存空间以存放由主调函

二维数组指针作为函数参数传递

以前二维数组作为函数参数传递我都是这么写的void def(int a[][10]).传递一个二维数组a,(其中第二维要确定大小)其实想一想挺合理的... 后来,发现还有这种写法 void def(int(*a)[10]): /* *********************************************** Author :guanjun Created Time :2017/3/18 13:32:52 File Name :33.cpp *******************