C,C++中如何向main(int argc , char argv[])傳遞引數
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中點選除錯,後臺執行結果如圖所示,
該列印輸出的是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對應的目錄下,執行結果所示,成功!
相關文章
- What does int argc, char* argv[] mean in C?(在c中,main函式引數的arc和arv有什麼用)GCAI函式
- linux中main引數傳遞LinuxAI
- C++引數的傳遞方式C++
- c++ -- 二維陣列引數傳遞C++陣列
- 你瞭解argc和argv嗎(以及在devc++中如何命令列傳參)GCdevC++命令列
- C++中string、char *、char[]、const char*的轉換C++
- dialog如何向其href指定的頁面傳遞引數?
- react篇章-React 元件-向元件傳遞引數React元件
- 向路由元件傳遞引數2種方法路由元件
- C++ 預設引數與引用傳遞:語法、用法及示例C++
- Yii2 layout 由 controller 向layout中傳遞引數值Controller
- C++中vector<int>& numsC++
- 引數傳遞
- c++單例模式、常量成員函式、引數傳遞、友元C++單例模式函式
- c++指標傳遞與引用傳遞C++指標
- C++ 可變引數模板遞迴展開C++遞迴
- 【php安全】 register_argc_argv 造成的漏洞分析PHPGC
- C中int main()必須reture一個值嗎AI
- c++中字串之string和charC++字串
- 如何計算PHP函式中傳遞的引數數量PHP函式
- Mybatis引數傳遞MyBatis
- Python工作筆記-往dll中傳入char*型別的引數並且如何接收char*的值Python筆記型別
- python中函式的引數傳遞Python函式
- 路由元件傳遞引數路由元件
- React事件傳遞引數React事件
- go 呼叫 shell 指令碼 如何傳遞引數Go指令碼
- JS的方法引數傳遞(按值傳遞)JS
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- C#程式設計:ref【引數按引用傳遞】C#程式設計
- 向檢視傳遞變數變數
- 引數傳遞方式必須是const引用傳遞
- 引數的定義和引數的傳遞
- t-on-click 傳遞引數
- 請求引數的傳遞
- Shell學習【引數傳遞】
- 利用閉包傳遞引數
- JavaScript函式傳遞引數JavaScript函式
- out,ref,params引數傳遞