A. C語言程序的命令行參數
在許多應用軟體運行時都帶有命令行參數,其實這些命令行參數在C語言編寫的程序中也可以實現,靈活地運用命令行參數進行處理可以有效地提高程序的運行效率,收到事半功倍的效果。
C語言中有關命令行參數涉及到程序的主函數main(int argc,char *argv[]這樣兩個參數,其中,int argc表示命令行參數的個數(包括可執行程序名本身),char *argv[]表示每個參數的具體內容,argv[0]為命令行中可執行程序名本身,argv[1]為命令行中第二個參數的內容,依次類推。如下例輸出命令行參數的個數及參數的內容:
main (int argc,char *argv[],
{int I;
printf(
命令行中可執行文件名為:%s,argv[0]);
printf(
總共有%d個參數:,argc);
I=0;
while(argc>=1)
{printf(″%s ,argv[I++]);
argc--;}
}
命令行參數用的最多還是在諸如DIR A:等之類帶有盤符、路徑或文件名這樣的命令行中,所以說靈活處理這一類參數才能有效地提高程序的運行效果。譬如DIR命令,其後可以是盤符,可以是路徑,也可以是文件名,如何區分這一參數呢?請看下例(此程序模擬DIR命令,程序要求在命令行輸入一個參數:盤符或路徑或文件名,若無參數或參數多於一個都將取默認的參數「*.*」)。
*--------------------
功能:模擬DIR命令進行處理命令行參數
--------------------*/
#include
#include
#include
#inchlude
int 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]);
else
strcpy(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);
B. C語言中的命令行是什麼,他有什麼作用.~~
就是運行程序的時候要帶進去的數據,一般留空即可,這個要講也是很復雜的..簡單來說,比如cs1.5
一般運行"d:\program
files\cs1.5\cstrike.exe"即可,但是我想進入控制台,那麼命令行參數為-console
就是說運行"d:\program
files\cs1.5\cstrike.exe"
-console就可以了
用過命令提示符沒有?比如x命令
x
c:\a.txt
d:\b.txt
其中"c:\a.txt
d:\b.txt"就是命令行參數
C. 什麼是C語言命令行參數
給你個例子,用C語言編程實現,運行時要求帶兩個字元串參數,輸出這兩個字元串之間的關系。
#include <stdio.h>
#include <string.h>
void main(int argc,char *argv[])
{
if (argc!=3)
printf("請在運行程序時提供兩個字元串參數!例如:testApp aaa bbb\n");
else
{
if (strcmp(argv[1],argv[2])>0)
printf("字元串1大於字元串2");
else if(strcmp(argv[1],argv[2])<0 )
printf("字元串1小於字元串2");
else
printf("字元串1等於字元串2");
}
}
把上述程序保存為testApp.cpp,然後編譯為testApp.exe文件,最後在命令行模式下按「testApp 字元串1 字元串2」的格式輸入命令,即可看到結果。
建議你了解一下DOS命令的初級知識,其實在windows-》運行,輸入CMD即可打開命令行操作窗口,然後就可以用輸入命令的方式運行一些應用程序了,一般格式就是「命令關鍵字 命令行參數列表」這種。比如你輸入「dir /ad」,其中dir就是命令,「/ad」就是命令行參數。
D. c語言命令行參數如何運行
1、命令行參數是保存在argv[]里的。argc只是說參數的個數。命令行參數一般是從argv[1]開始(包括argv[1])argv[0]是程序的名字。在輸命令的時候,命令行參數之間用空格隔開。
2、比如:
#include<stdio.h>
intmain(intargc,char*argv[])
{
if(argc<2)
{
printf("youmustinputargs!");
return0;
}
if(strcmp(argv[1],"help")==0)
{
printf("此程序參數如下: ");
printf("-c提示是否確定。 ");
printf("-d跳過警告,直接刪除。 ");
printf("exit為退出。");
return0;
}
elseif(strcmp(argv[1],"-c")==0)
{
//此處省略N行你的代碼
}
return0;
}
如果編譯出來的程序名字叫 test.exe,那麼在命令行下輸入 test.ext help後就會列印
此程序參數如下:
-c 提示是否確定。
-d 跳過警告,直接刪除。
exit為退出。
E. 什麼是c的命令行參數
所謂c語言的命令行參數,主要指的main函數的參數,main函數有操作系統來調用,用戶通過操作系統來運行軟體,因此可以傳遞參數。比如
intmain(intargc,char*argv[])//這是控制台上的main函數
其中argc用於說明傳遞的命令行參數的個數,argv是一個char *的指針數組,每1個元素代表一個參數。其中argv[0]即表示程序本身。
F. C語言中關於通過命令行獲取參數的編程
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc<2)
{
printf("you must input args!");
return 0;
}
if(strcmp(argv[1],"help")==0)
{
printf("此程序參數如下:\n");
printf("-c 提示是否確定。\n");
printf("-d 跳過警告,直接刪除。\n");
printf("exit為退出。");
return 0;
}
else if(strcmp(argv[1],"-c")==0)
{
//此處省略N行你的代碼
}
return 0;
}
如果你編譯出來的程序名字叫 test.exe 那麼在命令行下輸入 test.ext help後就會列印
此程序參數如下:
-c 提示是否確定。
-d 跳過警告,直接刪除。
exit為退出。
G. 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. h main(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()函數必須把這些數據存為全局型,或者通過(再次)入棧把它們傳遞給需要使用它們的函數。
H. 高手求教!!!c語言中怎樣讀取命令行參數
把main函數聲明為int main(int argc,char *argv[])
argc 是參數的個數
如:
int main(int argc,char *argv[])
{
printf("%s",argv[1]);
}
這是一個簡單的未做錯誤判斷的echo函數,將上面的源程序編譯連接為echo.exe,然後在命令提示符下輸入echo hello
這樣,argc=2,argv[0]為echo,argv[1]為hello
我沒用過linux,不知道上面的回答有沒有對上意思。
I. C中的命令行參數到底有什麼作用啊
C中的命令行參數又叫位置參數,它可以被傳到程序裡面,派各種用途。
C里的main()寫全了應當是:
main(int argc,char *argv[]){
..
}
argc的值等於位置參數總個數(包括程序名字)。
argv[0] 存程序名字,argv[1] 存第一個位置參數,argv[i]存第i 個位置參數,直到argv[argc-1].
例如: clip -in a.jpg -out b.jpg -x1 10 -y1 10 -x2 200 -y2 160
參數0,程序名clip
參數1,2: -in a.jpg 輸入文件名
參數3,4: -out b.jpg 輸出文件名
參數5,6: -x1 10 裁剪起點x座標
參數7,8: -y1 10 裁剪起點y座標
參數9,10:-x2 200 裁剪終點x座標
參數11,12: -y2 160 裁剪終點y座標
這些參數通過命令行傳入程序。
採用位置參數輸入方法,避免了對話輸入法。
例如,我要裁剪10張照片,我可以寫一個批文件my.bat
文件內容:
clip -in a1.jpg -out b1.jpg -x1 10 -y1 10 -x2 200 -y2 160
clip -in a2.jpg -out b2.jpg -x1 20 -y1 10 -x2 210 -y2 160
clip -in a3.jpg -out b3.jpg -x1 10 -y1 20 -x2 200 -y2 170
clip -in a4.jpg -out b4.jpg -x1 20 -y1 20 -x2 210 -y2 170
...
clip -in a10.jpg -out b10.jpg ...
運行my.bat,就裁剪了10張照片。不必對話輸入參數。
J. python筆記:命令行參數解析
有些時候我們需要通過命令行將參數傳遞給腳本,C語言中有個getopt()方法,python中也有個類似的命令行參數解析方法getopt()。python也提供了比getopt()更簡潔的argparse方法。另外,sys模塊也可以實現簡單的參數解析,本文將對這3種命令行參數解析方法簡要介紹。
sys.argv是傳入的參數列表,sys.argv[0]是當前python腳本的名稱,sys.argv[1]表示第一個參數,以此類推。
命令行運行:
可以看到傳入的參數通過sys.argv來獲取,它就是一個參數列表。
python的getopt與C語言的的getopt()函數類似。相比於sys模塊,支持長參數和短參數,並對參數解析賦值。但它需要結合sys模塊進行參數解析,語法格式如下:
短參數為單個英文字母,如果必須賦值需要在後面加英文冒號( : ),長參數一般為字元串(相比短參數,更能說明參數含義),如果必須賦值需要在後面加等號( = )。
命令行運行:
注意:短參數(options)和長參數(long_options)不需要一一對應,可以任意順序,也可以只有短參數或者只有長參數。
argparse模塊提供了很多可以設置的參數,例如參數的默認值,幫助消息,參數的數據類型等。argparse類主要包括ArgumentParser、add_argument和parse_args三個方法。
下面介紹這三個函數的使用方法。
argparse默認提供了 -h | --help 參數:
命令行運行:
下面列出部分參數:
下面來添加參數:
命令行運行:
parse_args() 方法用於解析參數,在前面的示例代碼中使用parse_args方法來提取參數值,對於無效或者錯誤的參數會列印錯誤信息和幫助信息:
命令行運行:
本文介紹了Python的三種命令行參數解析方法sys.argv、getopt和argparse,可以根據自己的需要進行選擇,getopt和argparse兩種方法相比來說,建議選擇argparse,代碼量更少更簡潔。更詳細的使用方法參考官方文檔:
--THE END--