[英]Command line arguments in a C program (from a shell)
我在寫命令行計算器。 用戶提供的每個表達式都必須用空格隔開(這是約定)。 例如: ./calc 2 + 5 * sin 45
問題是,當我嘗試獲取每個表達式時,我也將已編譯代碼的文件夾中的所有文件也用作參數...
這是代碼:
int main(int argc, char* argv[]) {
double result;
int i;
printf("Number of arguments: %d\n", argc);
for (i=0; i<argc; i++) {
printf("Argument: %s\n", argv[i]);
}
//result = equation(argv, argc);
//printf("Result is: %f", result);
return 0;
}
該示例表達式的輸出為:
Number of arguments: 10
Argument: ./calc
Argument: 2
Argument: +
Argument: 5
Argument: calc
Argument: calculate.c
Argument: lab2
Argument: sin
Argument: 45
我的問題是,為什么有calc
calculate.c
lab2
(當然這里這程序被編譯的文件夾包含所有三個文件)。 我應該在單獨的文件夾中編譯它嗎? 我嘗試了這種方法,但仍然有“計算”
ps。 我正在使用gcc
編譯器: gcc calculate -o calc
這與您的程序無關,而與您的shell無關。
大多數外殼將通配符*
擴展為所有匹配文件。 這包括UNIX shell(如bash)和Windows的cmd
。
您對此無能為力。 這就是它的工作方式。
另一種選擇是讓您的程序采用一個參數,該參數是一個包含要解析的表達式的字符串。 當然,您將必須進行解析,而不是由Shell為您完成解析。 例如
./calc '2 + 5 * sin 45'
請注意單引號。 這樣可以防止外殼擴展內部的任何內容。 這樣,您的字形圖具有argc == 2
,其中argv[1] == "2 + 5 * sin 45"
。
這是由於*字符的命令行擴展(與當前文件夾中的所有文件匹配)。 嘗試像這樣引用它:
./calc 2 + 5 '*' sin 45
或按以下步驟進行轉義:
./calc 2 + 5 \* sin 45
最好使用不同的字符..
*
字符是大多數shell上的特殊字符。 在Linux中,shell將其解釋為“當前目錄中的所有內容”,並在將其提供給命令之前將其展開。 這樣便可以使用如下命令:
grep 'some string' *
Shell展開*
表示所有文件,因此語句在所有文件中搜索“某些字符串”。 在您的情況下,當您希望外殼將*
解釋為文字字符時,應將其放在引號中,或使用\\
字符對其進行轉義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.