C,C++中如何向main(int argc , char argv[])傳遞引數

Blunt_Du發表於2020-12-24

C,C++中如何向main(int argc , char *argv[])傳遞引數

1.引言

​ 在編寫C語言程式中,main函式入口常用的編寫格式為,這個也是我們最常用到的格式

int main()

{

.....

return 0;

}

​ 本菜雞在做專案過程中,用到了一中帶引數的main函式,此篇文章進行解析。

2.一個最簡單的例子

​ 作業系統:Win 10,IDE:VS2019

​ 首先看一段最簡單的程式碼:

#include <stdio.h>
int main(int argc,char *argv[])
{
	for (int i = 0; i < argc; i++)
	{
		printf(argv[i]);
		printf("\t");
	}
}

​ 首先做一個解釋,main中傳入的兩個引數,argc代表傳入引數的個數, char *argv[]代表傳入的字串存放的 字元型指標陣列,該陣列的第一個元素預設存放程式所執行的exe的位置。

​ 在vs2019中點選除錯,後臺執行結果如圖所示,

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-er6QYMX8-1608785582693)(C:\Users\ell\AppData\Roaming\Typora\typora-user-images\image-20201224121933380.png)]

​ 該列印輸出的是exe程式存放的位置,這是因為*argv[1]預設存放的是程式檔案的地址,而我們無法通過vs的除錯視窗給程式輸入引數,所以只能列印argv[1].

​ 輸入引數只能通過windows的cmd命令視窗進行執行,開啟命令視窗,並切換到程式所在的資料夾,在後端輸入Project1.exe hello world,執行結果如下圖所示:

在這裡插入圖片描述

​ cmd中輸入Project1.exe代表代表執行這個可執行程式,引數為 hello world,由於hello和world中間用空格進行了間隔,程式會認為我們輸入了兩個引數,加主函式預設的地址,一共3個引數,這樣argc會自動賦值為3,argv[3]中就存放了3個字串,分別列印便得到了cmd中輸出的結果。

3.一個稍微複雜的例子

​ 新建工程,我們在工程中寫了三個檔案,分別是led.h,led.c和start_stop.c,用來模擬對一個小燈的亮滅的控制過程。

led.h

   #pragma once
   #include <stdio.h>
	void start();
	void stop();

led.c

#include <stdio.h>
#include <string.h>
#include "led.h"
int main(int argc, char* argv[]);
int main(int argc, char* argv[])
{
	if (strcmp(argv[1], "start") == 0)
	{
		start();
		return 0;
	}
if (strcmp(argv[1], "stop") == 0)
    {
        stop();
        return 0;
    }
//info();
return 0;
}

start_stop.c

#include "led.h"
void start()
{
	printf("LED is on");
}
void stop()
{
	printf("LED is off");
}

​ 這個程式的意圖是,我們在cmd視窗中啟動該程式,使用者輸入start或者stop的文字就可以模擬控制LED小燈的開關,因為argv[0]字元指標預設指向的是程式的檔案地址,因此使用者輸入的內容被存放argv[1]指向的記憶體中,然後我們再通過對*argv[1]進行判斷,來執行相應的操作。本程式可以在vs中進行編譯,但是卻無法在vs中除錯執行,這是因為在vs中無法輸入引數,導致argv[1]會讀到不屬於自己的記憶體範圍,發生錯誤。

在這裡插入圖片描述

win+R,輸入cmd來到cmd視窗,切換到exe對應的目錄下,執行結果所示,

不屬於自己的記憶體範圍,發生錯誤。

win+R,輸入cmd來到cmd視窗,切換到exe對應的目錄下,執行結果所示,成功!

在這裡插入圖片描述

相關文章