簡體   English   中英

C程序中的命令行參數(從shell)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM