
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點 (.) 運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案I/O(檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言命令列引數
在任何C程式中,可能有多個函式,但main()函式仍然是執行開始的入口點。雖然其他函式可能有一個或多個引數和一個返回型別,但main()函式通常沒有引數。main()函式的返回值也為“0”。
int main() { ... ... return 0; }
在main()函式內部,可能會有scanf()語句讓使用者輸入某些值,然後使用這些值。
#include <stdio.h> int main() { int a; scanf("%d", &a); printf("%d", a); return 0; }
什麼是命令列引數?
不必在程式內部呼叫輸入語句,可以在程式執行時從命令列將資料傳遞給main()函式。這些值稱為命令列引數。
命令列引數對您的程式很重要,尤其是在您希望從外部控制程式,而不是在程式碼內部硬編碼這些值時。
假設您想編寫一個名為“hello.c”的C程式,該程式為使用者列印“hello”訊息。我們希望從命令列傳遞名稱,而不是使用scanf()在程式內部讀取名稱,如下所示:
C:\users\user>hello Prakash
該字串將用作main()函式的引數,然後應顯示“Hello Prakash”訊息。
argc和argv
為了使main()函式能夠接受來自命令列的引數,您應該在main()函式中定義兩個引數——argc和argv[]。
argc表示傳遞的引數數量,argv[]是一個指標陣列,指向傳遞給程式的每個引數。
int main(int argc, char *argv[]) { ... ... return 0; }
argc引數應始終是非負的。argv引數是所有引數的字元指標陣列,argv[0]是程式的名稱。從“argv[argc - 1]”之前到此,每個元素都是一個命令列引數。
開啟任何文字編輯器並將以下程式碼儲存為“hello.c”:
#include <stdio.h> int main (int argc, char * argv[]){ printf("Hello %s", argv[1]); return 0; }
程式應該從argv[1]中獲取名稱,並在printf()語句中使用它。
不要從任何IDE(例如VS code或CodeBlocks)的執行選單執行程式,而是從命令列編譯它:
C:\Users\user>gcc -c hello.c -o hello.o
構建可執行檔案:
C:\Users\user>gcc -o hello.exe hello.o
將名稱作為命令列引數傳遞:
C:\Users\user>hello Prakash Hello Prakash
如果在Linux上工作,編譯預設情況下會將目標檔案生成 為“a.out”。我們需要在執行之前將其設定為可執行檔案,方法是在其前面加上“./”。
$ chmod a+x a.o $ ./a.o Prakash
示例
下面是一個簡單的示例,它檢查是否從命令列提供了任何引數,並據此採取行動:
#include <stdio.h> int main (int argc, char *argv[]) { if(argc == 2) { printf("The argument supplied is %s\n", argv[1]); } else if(argc > 2) { printf("Too many arguments supplied.\n"); } else { printf("One argument expected.\n"); } }
輸出
當以上程式碼編譯並執行帶單個引數時,它會產生以下輸出:
$./a.out testing The argument supplied is testing.
當以上程式碼編譯並執行帶兩個引數時,它會產生以下輸出:
$./a.out testing1 testing2 Too many arguments supplied.
當以上程式碼編譯並執行時沒有傳遞任何引數,它會產生以下輸出:
$./a.out One argument expected
需要注意的是,argv[0]儲存程式本身的名稱,argv[1]是指向提供的第一個命令列引數的指標,*argv[n]是最後一個引數。如果沒有提供引數,則argc將設定為“1”,如果傳遞一個引數,則argc將設定為“2”。
從命令列傳遞數值引數
讓我們編寫一個C程式,該程式讀取兩個命令列引數,並執行argv[1]和argv[2]的加法。
示例
首先儲存以下程式碼:
#include <stdio.h> int main (int argc, char * argv[]) { int c = argv[1] + argv[2]; printf("addition: %d", c); return 0; }
輸出
當我們嘗試編譯時,您會收到錯誤訊息:
error: invalid operands to binary + (have 'char *' and 'char *') int c = argv[1]+argv[2]; ~~~~~~~~~~~~~~
這是因為“+”運算子不能具有非數值運算元。
atoi()函式
為了解決這個問題,我們需要使用庫函式atoi(),它將數字的字串表示形式轉換為整數。
示例
以下示例顯示瞭如何在C程式中使用atoi()函式:
#include <stdio.h> #include <stdlib.h> int main (int argc, char * argv[]) { int c = atoi(argv[1]) + atoi(argv[2]); printf("addition: %d", c); return 0; }
輸出
從“add.c”編譯並構建一個可執行檔案,然後從命令列執行,傳遞數值引數:
C:\Users\user>add 10 20 addition: 30
示例
您透過空格分隔所有命令列引數,但如果引數本身包含空格,則可以透過將它們放在雙引號(" ")或單引號(' ')內來傳遞這些引數。
在這個例子中,我們將傳遞一個用雙引號括起來的命令列引數:
#include <stdio.h> int main(int argc, char *argv[]) { printf("Program name %s\n", argv[0]); if(argc == 2) { printf("The argument supplied is %s\n", argv[1]); } else if(argc > 2) { printf("Too many arguments supplied.\n"); } else { printf("One argument expected.\n"); } }
輸出
當以上程式碼編譯並執行帶單個空格分隔但用雙引號括起來的命令列引數時,它會產生以下輸出:
$./a.out "testing1 testing2" Program name ./a.out The argument supplied is testing1 testing2