[C/C++基礎知識] main函數的參數argc和argv


該篇文章主要是關於C++\C語言最基礎的main函數的參數知識,是學習C++或C語言都必備的知識點.不知道你是否知道該知識?希望對大家有所幫助.
一.main()函數參數
通常我們在寫主函數時都是void main()或int main() {..return 0;},但ANSI-C(美國國家標准協會,C的第一個標准ANSI發布)在C89/C99中main()函數主要形式為:
(1).int main(void)
(2).int main(int argc,char *argv[]) = int main(int argc,char **argv).
其參數argc和argv用於運行時,把命令行參數傳入主程序.其中ARG是指arguments,即參數.具體含義如下:
(參照Arguments to main和C++ Primer7.2.6節)
(1).int argc:英文名為arguments count(參數計數)
count of cmd line args,運行程序傳送給main函數的命令行參數總個數,包括可執行程序名,其中當argc=1時表示只有一個程序名稱,此時存儲在argv[0]中.
(2).char **argv:英文名為arguments value/vector(參數值)
pointer to table of cmd line args,字符串數組,用來存放指向字符串參數的指針數組,每個元素指向一個參數,空格分隔參數,其長度為argc.數組下標從0開始,argv[argc]=NULL.
argv[0] 指向程序運行時的全路徑名
argv[1] 指向程序在DOS命令中執行程序名后的第一個字符串
argv[2] 指向執行程序名后的第二個字符串
argv[argc] 為NULL.

二.源代碼中的argc與argv
由於C程序必須有main()函數為入口,而且它不能被其他函數調用(可以調用自身),因此不能再程序內部取得實際值.那么在何處把實參賦值給main函數的形參呢?這就需要調用"運行"或"DOS提示符",在調用可執行程序exe時,編譯器會幫助我們將輸入參數的信息放入main函數的參數列表中傳參.
1.計算命令行參數個數程序如下:

 1 <strong>//C 輸出參數個數
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 int main(int argc,char *argv[])  5 {  6     printf("參數個數=%d\n",argc);  7     system("PAUSE");  8     return 0;  9 } 10  
11 //C++ 輸出參數個數
12 #include <iostream>
13 using namespace std; 14 int main(int argc,char *argv[]) 15 { 16     cout<<"參數個數="<<argc<<endl; 17     system("PAUSE"); 18     return 0; 19 }</strong>

調用"運行"(快捷鍵Ctrl+R)或"cmd"輸入"G:\test.exe"會輸出"參數個數=1",此時存儲的就是執行程序名.輸入"G:\test.exe 2 hello good"輸出"參數個數=4":

2.查看argv[]二維數組存儲具體字符串的代碼如下:

 1 <strong>//C 查看argv存儲參數值及對應序號
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 int main(int argc,char *argv[])  5 {  6     int i;  7     printf("參數個數=%d\n",argc);  8     for(i=0; i<argc; i++)  9  { 10         printf("參數序號=%d ",i); 11         printf("參數值=%s\n",argv[i]); 12  } 13     system("PAUSE"); 14     return 0; 15 } 16  
17 //C++ 查看argv存儲參數值及對應序號
18 #include <iostream>
19 using namespace std; 20 int main(int argc,char *argv[]) 21 { 22     cout<<"參數個數="<<argc<<endl; 23     for(int i=0; i<argc; i++) 24  { 25         cout<<"參數序號="<<i<<" "; 26         cout<<"參數值="<<argv[i]<<endl; 27  } 28     system("PAUSE"); 29     return 0; 30 }</strong>

"運行"中輸入"G:\test.exe 2 hello good",則輸出入下圖所示:

其中argv[0]指向字符串可執行程序的名稱G盤下的test.exe,通常會位於"項目名稱\Debut\xxx.exe"中.后面argv[1..3]單元依次指向程序調用時的參數.

三.調用argc和argv
在"運行"中輸入"notepad.exe"回車能執行記事本程序(位於C:\Windows\System32),如果輸入"notepad.exe test.txt"可以打開test.txt文本文件,其中test.txt位於當前路徑下.如下圖所示:

為什么我要講述這個例子呢?主要是說明參數與exe之間的關系,main()函數其實與之也類似.同時在使用文件知識時,我們通常會涉及到main函數的argc和argv參數.如在《C++ Primer》這本書中第10.3.9實現單詞轉換的例子就涉及到該運用,這里只講述涉及到該參數的部分代碼供大家參考,大家可以自己去學習了解:

 1 #include <iostream>
 2 using namespace std;  3 int main(int argc,char *argv[])  4 {  5     //參數個數=3:工程名\讀取txt文件\寫入txt文件
 6     if(argc!=3)  7         throw runtime_error("wrong number of arguments");  8     //打開轉換文件,argv[1]為讀取的要轉換txt文件名 open_file自定義打開函數
 9     if(!open_file(map_file,argv[1])) 10         throw runtime_error("no transformation file"); 11     //打開要轉換的寫入txt文件
12     if(!open_file(input,argv[2])) 13         throw runtime_error("no input file"); 14     return 0; 15 }

其中具體操作是通過map(鍵-值對的集合)對象來實現,推薦大家看看這本最經典的C++書籍.
最后希望該文章對大家有所幫助,請不要小看這簡單的基礎知識,如果有錯誤或不足之處,還請海涵.
(By:Eastmount 2014-3-5 夜2點 原創:http://blog.csdn.net/eastmount)

上面這個博客對mian中的參數作用寫的很清楚,但是你也許會有疑問mian中有這些參數最終作用是什么呢?

說明這個問題前,先說說電腦中的每一個程序,熟悉linux系統的話,在終端下會常用ls、cat等終端命令,其實它們也是一個個獨立的c語言程序,既然是獨立的程序那么ls和cat各自都會有一個main函數,它們在運行時也是一個進程;ls命令會列出當前目錄下的有哪些文件,cat命令是直接輸出文件里面的內容,例如一個text.txt文件,cat text.txt就會將text文件中的內容輸出,那問什么cat這個程序后面跟text.txt就會輸出其中的內容呢?這就和mian中的參數有關了,下面以c語言的方式寫一個cat程序來講解

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS

int main(int argc, char* argv[]) { //1、打開文件,文件路徑argv[1],只讀方式
    FILE* fp = NULL; fopen_s(&fp, argv[1], "r"); //fp為文件描述符 //2、讀取文件內容,將內容顯示到屏幕
    char ch; while(1) { ch = fgetc(fp); if (feof(fp))//讀到空結束 { break; } printf("%c", ch); } //3、關閉文件
 fclose(fp); return 0; }

上面就是cat命令的程序,程序項目命名mycat,在vs中編譯生成mycat.exe,記住這個mycat.exe放在什么地方,下面會用到,我這里放在了E:\text\text\Debug\mycat.exe

我在F盤下新建了一個cc.txt文件里面輸入hellow world

下面就用mycat.exe程序輸出cc.txt文件。

windows+R

 點擊確定進入dos內

輸入mycat.exe和cc.txt各自的路徑,兩個路徑中間要用空格分開

 按下回車

看這不就將cc.txt內的內容直接輸出了嗎。

 E:\text\text\Debug\mycat.exe就放在了argv[0]中

F:\cc.txt就放在argv[1]中

在上面c語言程序內對argv[1]的操作才實現現在的效果

說白了就是一個編譯好的程序要對別的文件操作,就需要argv[ ]來記錄文件的路徑,才能在程序內部和文件關聯起來,而argc就是記錄可以同時關聯幾個文件,程序自身也算1個文件;就像argc = 1,argv[0]就是存放存放程序路徑,不能在有argv[1],因為argc已經說明只有一個文件而程序本身也是一個文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM