命令行参数的简介
命令行的参数1、 什么是命令行的参数?如: java Test1 365 156 China(以上Test1必须为主类,否则不能运行)2、命令行的参数由谁来接收?一个程序开始于对函数main()的调用。在这样做的时候,有两个参数被送给main(),其中的一个描述了命令行参数的个数,通常称为argc;另一个是命令行参数的数组,通常称为argv。命令行参数都是字符串,所以argv的类型是char* [argc+1]。该程序的名字也作为argv[0]传进来,所以argc的值至少是1。这个参数的表总以0结束,也就是说,argv[argc]==0。 3、在命令行给定参数时,应注意什么?命令行的参数以空格隔开。但是,若命令行的参数本身包含空格时,则该参数必须用一对双引号括起来。如: java Test1 365 156 China Beijing of China4、命令行中输入*(表示乘法)的方法:若直接在命令行中输入*(乘法),系统会处理成当前路径名的几个字符串,若要*表示乘法,应该输入“ *”或“ * ”,由args取得该字符串后,再用trim()去掉两端空格即可,当然也可输入“#*”,然后再想办法去掉前面的#即可,即只要不单独输入*即可。5、Total Commander启动时可以把一个或两个文件夹做为命令行参数。这些文件夹用来设置一侧或两侧的文件窗口。这样你可以在程序或启动菜单为Total Commander创建多个图标,每个Total Commander启动后打开不同文件夹甚至压缩包。而且可以指定不同的ini文件,不止默认的wincmd.ini,这样同一机器上的不同用户可以拥有不同的设置。
什么叫做命令行参数
在命令行中给定的参数就是命令行参数,执行程序时,可以从命令行传值给 C 程序,这些值被称为命令行参数,它们对程序很重要,特别是当从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。
在命令行给定参数时,应注意将命令行的参数以空格隔开,但是,若命令行的参数本身包含空格时,则该参数必须用一对双引号括起来。
C语言命令行参数
int main(int argc, char * argv[]){.....}argc: 代表启动程序时,命令行参数的个数。C和C++语言规定,可执行程序程序本身的文件名,也算是一个命令行参数,因此,argc的值至少是1.argv[]:指针数组,其中的每个元素都是一个char* 类型的指针,该指针指向一个字符串,这个字符串里就存放着命令行参数。例如,argv[0]指向的字符串就是第一个命令行参数,即可执行程序的文件名,argv[1]指向第二个命令行参数,argv[2]指向第三个命令行参数....。#include int main( int argc, char * argv[]){int i;for ( i = 0;i < argc; i++){printf("%s\n",argv[i]);}return 0;}windows下,将上面的程序编译成sample.exe,然后在控制台窗口敲:sample para1 para2 s.txt 5 "hello world"上面有6个参数,双引号为了包含空格作为一个参数。输出结果:samplepara1para2s.txt5hello world扩展资料:main函数通常含有参数argc和argv,写法通常如下:int main(int argc,char *argv[])int main(int argc,char **argv)程序:#includeint main(int argc,char *argv[]){int i;for(i=0;i<argc;i++)printf("第 %d 个参数是 %s\n",i+1,argv[i]);return 0;}
C#中的命令行参数
命令行参数的常见应用领域
1. 初始化程序
在CMD下输入这个命令 notepad d:\test.txt,此时记事本程序会判断D盘下有没有text.txt文件,如有则打开,如没有则提示是否要新建。2. 设置程序执行方式
我们在手工打OS补丁时,根据传入的参数可控制补丁程序的执行
以KB打头的补丁文件,参数可选/quiet/norestart/o,分别表示安装时无需用户参与、安装完成后不重启、不提示覆盖OEM文件。
以Q打头的补丁文件,参数可选/q/o/z,分别表示安装时无需用户干预、不提示覆盖OEM文件、安装完后不重新启动。命令行参数在C#中实现static void Main(string[] args)
...{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1(args));
} args是一个参数数组,这个名字只代表参数的意思,可以换成任何符合C#命名规范的名字。
通过访问这个数组,即可得到各个参数。 示例 1
本示例演示如何输出命令行参数.
// cmdline1.cs
// arguments: A B C
using System;
public class CommandLine
{
public static void Main( string[] args )
{
// The Length property is used to obtain the length of the array.
// Notice that Length is a read-only property:
Console.WriteLine( "Number of command line parameters = {0}",
args.Length );
for( int i = 0; i < args.Length; i++ )
{
Console.WriteLine( "Arg[{0}] = [{1}]", i, args[i] );
}
}
}
输出
使用如下所示的一些参数运行程序:cmdline1 A B C.
输出将为:
Number of command line parameters = 3
Arg[0] = [A]
Arg[1] = [B]
Arg[2] = [C]
示例 2
循环访问数组的另一种方法是使用 foreach 语句,如本示例所示.foreach 语句可用于循环访问数组或“.NET Framework”集合类.它提供了一种简单的方法来循环访问集合.
// cmdline2.cs
// arguments: John Paul Mary
using System;
public class CommandLine2
{
public static void Main( string[] args )
{
Console.WriteLine( "Number of command line parameters = {0}",
args.Length );
foreach( string s in args )
{
Console.WriteLine( s );
}
}
}
输出
使用如下所示的一些参数运行程序:cmdline2 John Paul Mary.
输出将为:
Number of command line parameters = 3
John
Paul
Mary
C语言如何获得命令行参数
C语言获得命令行参数的方法每当你运行一个DOS或Windows程序时,都会生成一个程序段前缀(Program SegmentPrefix,简称PSP)。当DOS程序的装入程序把程序复制到RAM中来执行时,它先把256个字节分配给PSP,然后把可执行代码复制到紧接着PSP的内存区域中。PSP中包含了DOS为了执行一个程序所需要的各种各样的信息,其中的一部分数据就是命令行。PSP中偏移量为128的那个字节中存放着命令行中的字符个数,接下来的127个字节中存放着命令行本身。这也正是DOS把你能在其提示行中输入的字符个数限制在127个之内的原因——因为它为命令行分配的存储空间只有那么多。遗憾的是,PSP的命令行缓冲区中并没有存放可执行程序的名字——而只存放着在可执行程序名后键入的字符(包括空格符)。例如,如果你在DOS提示行中键入以下命令:XCOPY AUTOEXEC.BAT AUTOEXEC.BAK假设XCOPY.EXE存放在c驱动器的DOS目录下,则XCOPY.EXE的PSP命令行缓冲区中将包含以下信息:AUTOEXEC.BAT AUTOEXEC.BAK注意,命令行中紧接着"XCOPY"的空格符也被复制到PSP的缓冲区中。除了不能在PSP中找到可执行程序名外,PSP还有一个不足之处——在命令行中能看到的对于输出或输入的重定向,在PSP的命令行缓冲区中是无法看到的,也就是说,你无法从PSP中得知你的程序是否被重定向过。到现在为止,你应该熟悉在C程序中可以通过argc和argv来获取一些有关信息,但是,这些信息是怎样从DOS的装入程序传给argv指针的呢?这是由程序的启动代码来完成的。启动代码在main()函数的第一行代码之前被执行,在其执行期间,它调用一个名为__setargv()的函数,把程序名和命令行从PSP和DOS环境中复制到mai‘n()函数的argv指针所指向的缓冲区中。你可以在xLIBCE.LIB文件中找到_setargv()函数,对于Small,Medium和Large这三种存储模式,这里的“x”分别为“S”,“M”和“L”。在生成可执行程序时,上述库文件会自动被连接进来。除了复制argv参数的内容外,c的启动代码还要完成其它一些工作。当启动代码执行完毕后,main()函数中的代码就开始执行了。在DOS中的情况是这样的,那么在Windows中的情况又是怎样的呢?实际上,在Windows中的情况大致上和在DOS中的一样。当执行一个Windows程序时,与DOS的装入程序一样,Windows的装入程序也会建立一个PSP,其中包含了与DOS的PSP中相同的信息。主要的区别是此时命令行被复制到lpszCmdLine参数中,它是WinMain()函数的参数表中的第三个(也是倒数第二个)参数。在Windows C的xLIBCEW.LIB库文件中包含了启动函数setargv(),它负责把命令行信息复制到lpszCmdLine缓冲区中。同样,这里的“x”也表示程序所使用的存储模式。在Quick c中,函数_setargv()包含在库文件xLIBCEWQ.LIB中。尽管DOS程序和Windows程序的命令行信息的管理方式基本相同,但是传给你的C程序的命令行的格式在安排上稍有不同。在DOS中,启动代码获得以空格符为分隔符的命令行后,就把每个参数转换为其自身的以NULL为终止符的字符串。因此,你可把argv原型化为一个指针数组(char* argv[]),并通过从O到n这些下标值来访问每个参数,其中n等于命令行中的参数个数减去1。你也可以把argv原型化为一个指向指针的指针(char **argv),并通过增减argv的值来访问每一个参数。在Windows中,传给c程序的命令行是一个LPSTR类型或char_far*类型,其中的每一个参数都用空格符隔开,就象你在DOS提示行中键入这些字符后所看到的那样(实际上,在Windows中不可能真正键入这些字符,而是通过双击应用程序图标这样的方式来启动一个程序)。为了访问Windows命令行中的各个参数,你必须人工地访问lpszCmdLine所指向的存储区,并分隔存放在该处的参数,或者使用strtok()这样的函数,每次处理一个参数。如果你富于探索精神,你可以仔细地研究PSP本身,并从中获取命令行信息。为此,你可以像下面这样来使用DOS中断21H(此处使用Microsoft C):# include <stdio. h# incIude <dos. hmain(int argc,char **argv){union REGS regs ; / * DOS register access struct * /char far * pspPtr; / * pointer to PSP * /int cmdLineCnt; / *num of chars in cmd line * /regs. h. ah=0x62; /*use DOS interrupt 62 *;int86(0x21 ,®s,&egs) ; / *call DOS * /FP-SEG(pspPtr) =regs. x. bx ; / *save PSP segment * /FP_OFF(pspPtr)=0xS0; / * set pointer offset * // * * pspPtr now points to the command-line count byte * /cmdLineCnt== * pspPtr ;需要注意的是,在Small存储模式下,或者在只有一个代码段的汇编程序中,由DOS返回到BX寄存器中的值就是程序代码段的地址值;在Large模式的c程序中,或者在多个代码段的汇编程序中,所返回的值是程序中包含PSP的那个代码段的段地址值。如果你已经建立了一个指向这个数据的指针,你就可以在程序中使用这个数据了。今天,通常你可以认为你的程序可以使用命令行参数。但是,在DOS 2.O版以前,存储在PSP中的命令行信息与现在稍有不同(它不能从命令行中分离出输入或输出重定向数据),而且由argv[O]所指向的数据中并不一定包含可执行程序的路径名。直到DOS发展到3.o版,它才提供了(或者说至少公开了)用来检索PSP的中断62H。因此,你至少可以认为,在运行DOS3.0或更高版本的PC上,你的程序总是可以获得命令行参数的。如果你的程序运行在DOS 3.0或更高的版本下,你基本上就可以任意处理命令行参数了,因为这些信息已存入栈中供你使用。显然,适用于栈中数据的常规的数据操作规则同样也适用于存入栈中的命令行参数。然而,如果你的编译程序不提供argv参数,例如当你用汇编语言或者某种不提供argv参数的编译程序编写程序时,真正的问题就出现了。在这种情况下,你将不得不自己找出检索命令行参数的方法,而使用DOS中断62H就是一种很方便的方法。如果你要用DOS中断62H来检索指向命令行的指针,你必须明白该指针所指向的数据是供DOS使用的,并且正在被DOS使用。尽管你可以检索这些数据,但你不可以改变它们。如果在程序中需要随时根据命令行参数作出决定,那么在使用这些数据之前应该先把它们复制到一个局部缓冲区中,这样就可以随意处理这些数据,而不用担心会与DOS发生冲突了。实际上,这种技巧同样适用于带argv参数的c程序。位于main()函数之外的函数需要使用命令行参数的情况并不少见,为了使这些函数能引用这些数据,main()函数必须把这些数据存为全局型,或者通过(再次)入栈把它们传递给需要使用它们的函数。
c语言习题,我完全没头绪,命令行参数是什么东西啊??
void main(int argc, char *argv[])这句话中括号中的int argc,char *argv[]是可以省略的,这是就是命令行参数,argc的值就是你命令行参数的项数,你是windows环境么?windows下编译好一个程序是直接双击运行,但是你找到文件目录,可以从控制台输入文件名执行的,那么你输入在控制台的内容就叫做命令行参数,包括文件名和后面的内容,以空格隔开,比如你这个程序叫2-5.那么当你在控制台输入2-5的时候,argc就为1,当你输入2-5 file1的时候,argc就为2,现在知道为什么argc为4了吧。至于argv[],这是一个字符串数组,因为argc为4,所以定义了一个字符串数组为argv[4],有四个元素,分别为argv[0],argv[1],argv[2],argv[3],p = argv[1]。就是file1啦,puts(p+1),地址向右偏移一位,所以前面的f就不见啦
C语言程序的命令行参数
在许多应用软件运行时都带有命令行参数,其实这些命令行参数在C语言编写的程序中也可以实现,灵活地运用命令行参数进行处理可以有效地提高程序的运行效率,收到事半功倍的效果。C语言中有关命令行参数涉及到程序的主函数main(int argc,char *argv[]这样两个参数,其中,int argc表示命令行参数的个数(包括可执行程序名本身),char *argv[]表示每个参数的具体内容,argv[0]为命令行中可执行程序名本身,argv[1]为命令行中第二个参数的内容,依次类推。如下例输出命令行参数的个数及参数的内容:main (int argc,char *argv[],{int I;printf(\n命令行中可执行文件名为:%s,argv[0]);printf(\n总共有%d个参数:,argc);I=0;while(argc>=1){printf(″%s ,argv[I++]);argc--;}}命令行参数用的最多还是在诸如DIR A:等之类带有盘符、路径或文件名这样的命令行中,所以说灵活处理这一类参数才能有效地提高程序的运行效果。譬如DIR命令,其后可以是盘符,可以是路径,也可以是文件名,如何区分这一参数呢?请看下例(此程序模拟DIR命令,程序要求在命令行输入一个参数:盘符或路径或文件名,若无参数或参数多于一个都将取默认的参数“*.*”)。\*--------------------功能:模拟DIR命令进行处理命令行参数--------------------*/#include#include#include#inchludeint j,num=0;char ss[20],path[50],path2[50];void main (int argc,char *argv[]){struct ffblk f;int done;if(argc==2) /*取命令行参数到数组中*/strcpy(ss,argv[1]);elsestrcpy(ss,″*.*″); /*给数组赋值缺省参数*/if (((ss[strlen(ss)-1]==′\\′||((ss[strlen(ss)-1]==':'))strcat(ss,″*.*″); /*若参数为路径或盘符,则加上″*.*″ */getcwd(path1,50); /*取当前路径*/if (chdir(ss)==0) /*判断参数是否为路径*/strcat(ss,\\*.*); /*若路径末没有带\,则加上*.* */chdir(path1); /*恢复原来路径*/strcpy(path2,ss);