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()函式中定義兩個引數——argcargv[]

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
廣告