argc (argument count):命令行參數總個數,包含程序名自身。argv (argument vector):字符串指針數組,argv[0] 為程序路徑/名稱,argv[1]...argv[argc-1] 為用戶傳入參數,argv[argc] == NULL。#includeint main(int argc, char *argv[]) { printf("argc = %d\n", argc); for (int i = 0; i <= argc; ++i) printf("argv[%d] = %s\n", i, argv[i] ? argv[i] : "(null)"); return 0; }
編譯為 test,運行 ./test arg_1 arg_2 輸出:
argc = 3 argv[0] = ./test argv[1] = arg_1 argv[2] = arg_2 argv[3] = (null)
#include#include int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } FILE *fp = fopen(argv[1], "r"); if (!fp) { perror("fopen"); return 1; } int ch; while ((ch = fgetc(fp)) != EOF) putchar(ch); fclose(fp); return 0; }
argc,避免 argv[1] 訪問越界。fprintf(stderr, ...) 與 perror(),便於管道重定向時區分正常輸出與錯誤信息。fclose(fp);異常返回前亦需關閉。"rb",輸出用 fwrite 而非 putchar。argv[0] 可能包含完整路徑,建議用 basename() 或手動提取文件名用於提示信息。for (int i = 1; i < argc; ++i) {
FILE *fp = fopen(argv[i], "r");
if (!fp) { perror(argv[i]); continue; }
int ch;
while ((ch = fgetc(fp)) != EOF) putchar(ch);
fclose(fp);
}
配合 Shell 通配符 ./print *.txt 可批量處理多文件。