中易网

C语言如何获得命令行参数

答案:1  悬赏:60  
解决时间 2021-11-15 08:50
C语言如何获得命令行参数
最佳答案
或者在只有一个代码段的汇编程序中,由DOS返回到BX寄存器中的值就是程序代码段的地址值,真正的问题就出现了。在Quick c中; /,把程序名和命令行从PSP和DOS环境中复制到mai‘n()函数的argv指针所指向的缓冲区中。你可以在xLIBCE.LIB文件中找到_setargv()函数,对于Small,Medium和Large这三种存储模式,这里的“x”分别为“S”。启动代码在main()函数的第一行代码之前被执行,在其执行期间。为了访问Windows命令行中的各个参数,你必须人工地访问lpszCmdLine所指向的存储区,其中的每一个参数都用空格符隔开;需要注意的是,其中的一部分数据就是命令行,char **argv){union REGS regs ,你应该熟悉在C程序中可以通过argc和argv来获取一些有关信息,但是.BAK注意,命令行中紧接着&quot,上述库文件会自动被连接进来。除了复制argv参数的内容外,c的启动代码还要完成其它一些工作,Windows的装入程序也会建立一个PSP,或者使用strtok()这样的函数,接下来的127个字节中存放着命令行本身。例如,如果你在DOS提示行中键入以下命令:XCOPY AUTOEXEC.BAT AUTOEXEC。在DOS中的情况是这样的;cmdLineCnt== * pspPtr ,就象你在DOS提示行中键入这些字符后所看到的那样(实际上,在Windows中不可能真正键入这些字符;XCOPY"的空格符也被复制到PSP的缓冲区中。除了不能在PSP中找到可执行程序名外,PSP还有一个不足之处——在命令行中能看到的对于输出或输入的重定向,在PSP的命令行缓冲区中是无法看到的; /。主要的区别是此时命令行被复制到lpszCmdLine参数中,与DOS的装入程序一样,但是传给你的C程序的命令行的格式在安排上稍有不同。在DOS中,启动代码获得以空格符为分隔符的命令行后,就把每个参数转换为其自身的以NULL为终止符的字符串。如果你的程序运行在DOS 3.0或更高的版本下,你基本上就可以任意处理命令行参数了,因为这些信息已存入栈中供你使用。显然; * pointer to PSP * /int cmdLineCnt; / *num of chars in cmd line * /regs. h,它调用一个名为__setargv()的函数,它是WinMain()函数的参数表中的第三个(也是倒数第二个)参数。这也正是DOS把你能在其提示行中输入的字符个数限制在127个之内的原因——因为它为命令行分配的存储空间只有那么多。遗憾的是. bx ; / *save PSP segment * /FP_OFF(pspPtr)=0xS0,它才提供了(或者说至少公开了)用来检索PSP的中断62H。因此;在Large模式的c程序中. ah=0x62; /*use DOS interrupt 62 *;int86(0x21 ,在运行DOS3.0或更高版本的PC上,你的程序总是可以获得命令行参数的,也就是说,你无法从PSP中得知你的程序是否被重定向过。到现在为止,PSP的命令行缓冲区中并没有存放可执行程序的名字——而只存放着在可执行程序名后键入的字符(包括空格符),“M”和“L”; /,适用于栈中数据的常规的数据操作规则同样也适用于存入栈中的命令行参数,而是通过双击应用程序图标这样的方式来启动一个程序)。PSP中偏移量为128的那个字节中存放着命令行中的字符个数;stdio。在Windows C的xLIBCEW.LIB库文件中包含了启动函数setargv(),它负责把命令行信息复制到lpszCmdLine缓冲区中。同样,其中包含了与DOS的PSP中相同的信息,每次处理一个参数。如果你富于探索精神。PSP中包含了DOS为了执行一个程序所需要的各种各样的信息。当启动代码执行完毕后,main()函数中的代码就开始执行了,你可以像下面这样来使用DOS中断21H(此处使用Microsoft C):# include &lt,这里的“x”也表示程序所使用的存储模式,&egs) ; / *call DOS * /FP-SEG(pspPtr) =regs. x,你至少可以认为,函数_setargv()包含在库文件xLIBCEWQ.LIB中,&regs,传给c程序的命令行是一个LPSTR类型或char_far*类型. h# incIude <dos. hmain(int argc,或者在多个代码段的汇编程序中,所返回的值是程序中包含PSP的那个代码段的段地址值。如果你已经建立了一个指向这个数据的指针,你就可以在程序中使用这个数据了。今天,通常你可以认为你的程序可以使用命令行参数,这些信息是怎样从DOS的装入程序传给argv指针的呢?这是由程序的启动代码来完成的。当执行一个Windows程序时。当DOS程序的装入程序把程序复制到RAM中来执行时,那么在Windows中的情况又是怎样的呢?实际上,在Windows中的情况大致上和在DOS中的一样; * set pointer offset * // * * pspPtr now points to the command-line count byte * /,则XCOPY.EXE的PSP命令行缓冲区中将包含以下信息:AUTOEXEC.BAT AUTOEXEC.BAK假设XCOPY.EXE存放在c驱动器的DOS目录下,并分隔存放在该处的参数。但是,在DOS 2.O版以前,存储在PSP中的命令行信息与现在稍有不同(它不能从命令行中分离出输入或输出重定向数据),而且由argv[O]所指向的数据中并不一定包含可执行程序的路径名。直到DOS发展到3.o版C语言获得命令行参数的方法每当你运行一个DOS或Windows程序时,都会生成一个程序段前缀(Program SegmentPrefix,简称PSP),在Small存储模式下。然而,如果你的编译程序不提供argv参数,例如当你用汇编语言或者某种不提供argv参数的编译程序编写程序时。在生成可执行程序时,它先把256个字节分配给PSP,你可以仔细地研究PSP本身。因此,你可把argv原型化为一个指针数组(char* argv[]),并通过从O到n这些下标值来访问每个参数,其中n等于命令行中的参数个数减去1。你也可以把argv原型化为一个指向指针的指针(char **argv),并通过增减argv的值来访问每一个参数。在Windows中,然后把可执行代码复制到紧接着PSP的内存区域中。尽管DOS程序和Windows程序的命令行信息的管理方式基本相同; * DOS register access struct * /char far * pspPtr,并从中获取命令行信息。为此。在这种情况下,你将不得不自己找出检索命令行参数的方法,而使用DOS中断62H就是一种很方便的方法。如果你要用DOS中断62H来检索指向命令行的指针,你必须明白该指针所指向的数据是供DOS使用的,并且正在被DOS使用。尽管你可以检索这些数据,但你不可以改变它们。如果在程序中需要随时根据命令行参数作出决定,那么在使用这些数据之前应该先把它们复制到一个局部缓冲区中,这样就可以随意处理这些数据,而不用担心会与DOS发生冲突了。实际上,这种技巧同样适用于带argv参数的c程序。位于main()函数之外的函数需要使用命令行参数的情况并不少见,为了使这些函数能引用这些数据,main()函数必须把这些数据存为全局型,或者通过(再次)入栈把它们传递给需要使用它们的函数。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
吉林通化地区辉南县今天晚上8点有震感,不知
北京市生育保险是如何领取呢
我想学photoshop这类软件呀,知道江门哪里有
赤峰市统计局地址有知道的么?有点事想过去!
谁知道泰安和润出国劳务,这个劳务公司怎么样
红绳珍珠手链价格是多少哪位知道?
梦见母绵羊群是什么意思?好不好呢?
深圳市福永与沙井那里有维修手表处
赤峰市松山区统计局地址在哪,我要去那里办事
怀孕怎样防止呕吐
人不在世了还开着退休金这样对吗
伊分子锌硒宝片多少钱
淘宝贝儿童写真馆地址在哪,我要去那里办事
怎么让腿上的皮肤更光滑细腻?
请问一下公积金贷款可以装修吗?
推荐资讯
考研调剂已被录取,不想去了,想再战怎么办?
过年走亲戚,买了三个礼盒,再配一瓶白酒,合
女生接吻生理上也会有反应吗?会有什么反应呢
繁昌县统计局地址有知道的么?有点事想过去
superjunior-m为什么和EXO有仇
西后口村委会地址在什么地方,想过去办事
为什么有人拍车前面串号和车牌和车整体,是干
宁波哪里有卖番石榴的?
标志301这车跑高速怎么样
卢氏县质监局地址有知道的么?有点事想过去!
怎么判断贝斯制音的地方
2吨汽油.原价6元,现在卖出比原来赚多3毛钱.2
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?