C程序入口 main(int argc, char *argv[]) 接收兩個參數:
argv[0] 為程序路徑,argv[1] 起為實際參數#include <stdio.h>
int main(int argc, char *argv[]) {
printf("程序名: %s\n", argv[0]);
printf("參數個數: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
運行 ./demo arg1 arg2 輸出:
程序名: ./demo
參數個數: 3
argv[0] = ./demo
argv[1] = arg1
argv[2] = arg2
需求:接受盤符(C:)、路徑(C:\Windows)、文件名(test.txt)或無參數(默認 *.*),自動補全通配符並列出文件。
argc==2 取 argv[1],否則默認 *.*\ 或 : 結尾視為目錄,補全 *.*chdir() 切換,保留文件模式匹配findfirst()/findnext() 獲取文件信息#include <stdio.h>
#include <string.h>
#include <dir.h> // findfirst/findnext
#include <dos.h> // getcwd/chdir
void main(int argc, char *argv[]) {
struct ffblk f;
char pattern[20], path[50], dirpart[50];
int done, count = 0, line = 1;
// 1. 參數處理與通配符補全
if (argc == 2) strcpy(pattern, argv[1]);
else strcpy(pattern, "*.*");
int len = strlen(pattern);
if (pattern[len-1] == '\\' || pattern[len-1] == ':')
strcat(pattern, "*.*");
// 2. 目錄切換與路徑分離
getcwd(path, 50);
if (chdir(pattern) == 0) { // 是目錄
strcat(pattern, "\\*.*");
chdir(path); // 恢復原目錄
}
strcpy(dirpart, pattern);
for (int i = strlen(dirpart)-1; i >= 0; i--) {
if (dirpart[i] == '\\' || dirpart[i] == ':') {
dirpart[i+1] = '\0';
break;
}
}
if (strlen(dirpart) == 0) strcpy(dirpart, path);
// 3. 文件查找循環
printf("模擬DIR命令 目錄: %s\n", dirpart);
done = findfirst(pattern, &f, FA_ARCH | FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_LABEL);
while (!done) {
if (!(f.ff_attrib & FA_DIREC))
printf("%-15s %10ld\n", f.ff_name, f.ff_fsize);
else
printf("%-15s \n", f.ff_name);
count++; line++;
if (line == 24) {
printf("--- More (按任意鍵) ---");
getch();
line = 1;
printf(" (目錄: %s)\n", dirpart);
}
done = findnext(&f);
}
printf("共 %d 個文件\n", count);
}
\\,Linux單斜杠 /,可用 #ifdef _WIN32 區分findfirst 僅支援8.3格式,現代代碼應用 FindFirstFileW (Windows) 或 opendir/readdir (POSIX)"C:\Program Files",argv 自動去除引號getopt() (POSIX) 或 CommandLineToArgvW (Windows) 處理複雜選項解析生產環境建議使用成熟庫:
自行解析僅適合簡單場景或教學演示。