C 語言中的 argc 和 argv
Jinku Hu
2023年10月12日
本文將講解 C 語言中使用命令列引數 argc
和 argv
的幾種方法。
使用 int argc, char *argv[]
記法來獲取 C 語言中的命令列引數
執行程式時,使用者可以指定被稱為命令列引數的以空格分隔的字串。這些引數在程式的 main
函式中提供,並可被解析為單獨的空端字串。要訪問這些引數,我們應該包含引數為 int argc, char *argv[]
,代表傳遞的引數數和包含命令列引數的字串陣列。按照慣例,陣列中的第一個字串是程式本身的名稱,因此,引數數 argc
包括程式名稱。我們可以通過簡單的迭代來列印每個命令列引數,如下例所示。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
for (int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);
exit(EXIT_SUCCESS);
}
示例命令:
./program hello there
輸出:
argv[0] = ./program
argv[1] = hello
argv[2] = there
argv
陣列中的空端字串以 NULL
指標結束,表示最後一個引數。因此,我們可以利用這個特性,通過評估 argv
指標本身並將其遞增,直到等於 NULL
為止,來實現引數列印迴圈。需要注意的是,最好為迴圈單獨做一個 char*
指標,以保留陣列的原始地址,以防以後程式中需要它。下面的示例程式碼假設執行的命令與前面的例子相同。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char **ptr;
for (ptr = argv; *ptr != NULL; ptr++) printf("%s\n", *ptr);
exit(EXIT_SUCCESS);
}
輸出:
./program
hello
there
使用 memccpy
在 C 語言中連線命令列引數
memccpy
函式是標準庫字串實用程式的一部分,用於連線 argv
陣列字串。請注意,memccpy
與 memcpy
類似,只是它使用第四個引數來指定何時停止複製的字元。我們利用後者的特性,只複製字串內容,並在終止的空位元組處停止。在下面的例子中,我們檢查使用者提供的兩個引數是否準確(除了程式名),然後才繼續程式的執行。因此,我們鏈式呼叫兩個 memccpy
來複制兩個引數,並將連線後的字串列印到 stdout
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program string1 string2\n");
exit(EXIT_FAILURE);
}
size_t size = strlen(argv[1]) + strlen(argv[2]);
char buf[size];
memccpy(memccpy(buf, argv[1], '\0', size) - 1, argv[2], '\0', size);
printf("%s\n", buf);
exit(EXIT_SUCCESS);
}
輸出:
hellothere
作者: Jinku Hu