C 語言 main 函數完整簽名為 int main(int argc, char *argv[]),可接收命令列參數。本文演示如何解析 argv 實現一個支援加減乘除的整數計算機,並對比兩種參數處理策略。
int calculator(int num1, char *op, int num2) {
if (strcmp(op, "-a") == 0) return num1 + num2; // 加
if (strcmp(op, "-s") == 0) return num1 - num2; // 減
if (strcmp(op, "-m") == 0) return num1 * num2; // 乘
if (strcmp(op, "-d") == 0) return num1 / num2; // 除
return -1; // 未知操作
}
關鍵點:字符串比較必用 strcmp,不可直接 op == "-a"(比較指針位址而非內容)。
程式啟動後提示輸入 5+3 格式,內部將運算符映射為選項字串:
int main() {
int num1, num2; char op;
scanf("%d%c%d", &num1, &op, &num2); // 讀 5+3
char *opt;
switch(op) {
case '+': opt = "-a"; break;
case '-': opt = "-s"; break;
case '*': opt = "-m"; break;
case '/': opt = "-d"; break;
default: opt = ""; break;
}
int ret = calculator(num1, opt, num2);
printf("%d%c%d=%d\n", num1, op, num2, ret);
return 0;
}
執行 ./calc -a 5 3,直接解析 argv:
int main(int argc, char *argv[]) {
if (argc != 4) { printf("Usage: %s -a|-s|-m|-d num1 num2\n", argv[0]); return 1; }
int num1 = atoi(argv[2]);
int num2 = atoi(argv[3]);
int ret = calculator(num1, argv[1], num2);
if (ret == -1) printf("Invalid operator\n");
else printf("%d %s %d = %d\n", num1, argv[1], num2, ret);
return 0;
}
此法更符合 Unix 哲學,便於腳本調用與管道組合。
if (p == "-a") 永假,必用 strcmp(p, "-a") == 0。num2 == 0 時 / 觸發未定義行為,需加判斷。atoi 非數字傳回 0,無法區分「輸入 0」與「輸入錯誤」,建議用 strtol。double + strtod + %f。argv 中的運算符優先級(遞歸下降或 Shunting-yard)。%)、冪次(^)等運算子。掌握 argc/argv,是編寫專業命令列工具的第一步。