簡體   English   中英

在C中使用命令行參數?

[英]taking command line parameters in C?

因此,我剛接觸C並試圖學習如何使其接受命令行輸入,所以我輸入了我希望它是正確語法的字符,然后嘗試獲取它,因此您輸入了2個數字並它返回這兩個數字加在一起。 該程序確實可以編譯,但是當我嘗試運行該程序時,它將使用參數,並且它們被完全錯誤地打印,就像它們在打印內存地址一樣。

這是我的代碼:

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int addition(int a, int b);

int main(int argc, char *argv[]) {
    if(argc != 3) {
        printf("You must enter 2 numbers!");
        return TRUE;
    }
    else {
        int answer = addition((int)*(argv[0]), (int)*(argv[1]));
        printf("%d + %d = %d", argv[0], argv[1], answer);
        return FALSE;
    }
}

int addition(int a, int b) {
    return a + b;
}

那我在做什么錯? 當我放入2 3時,輸出為:

155 + 50 = 165

通過**argv傳遞給您的值不是整數,它們是以null結尾的字節字符串。 為了執行加法atoi() ,首先需要使用atoi()類的東西將它們轉換為整數。 否則,您將在字符數組上執行數字加法。

替換這些行:

int answer = addition((int)*(argv[0]), (int)*(argv[1]));
printf("%d + %d = %d", argv[0], argv[1], answer);

與:

int answer = addition(atoi(argv[1]), atoi(argv[2]));
printf("%d + %d = %d", atoi(argv[1]), atoi(argv[2]), answer);

正如David Hoelzer在另一個答案中所說的那樣,參數包含以null結尾的字節字符串。 使用atoi()會將字符串轉換為整數。

請改用argv[1]argv[2]因為它們實際上將是包含您輸入的值的參數。 根據ISO C標准規范:

如果argc的值大於零,則argv [0]指向的字符串表示程序名稱; 如果程序名稱在主機環境中不可用,則argv [0] [0]應為空字符。

argv[0]將包含程序的名稱。

有關argv[0]作為程序名稱的更多信息, 請參見此StackOverflow答案

關於代碼,您始終可以將參數存儲在這樣的變量中:

int a = atoi(argv[1]);
int b = atoi(argv[2]);

然后將它們傳遞給您的addition()函數,並在printf()部分中使用它。

int answer = addition((int)*(argv[0]), (int)*(argv[1]));
printf("%d + %d = %d", argv[0], argv[1], answer);

恐怕這將無法按您期望的那樣工作。 argv[x]是指向char的指針,而不是整數。 例如,如果您輸入“ 2 3”,則argv[0]指向代表正在運行的程序名稱的字符串(如果名稱不可用,則為空指針), argv[1]指向“ 2” , argv[2]指向“ 3”,而argv[argc] (即argv[3] )指向空指針。

要轉換本質上是const char數組的字符串,僅強制轉換不起作用。 您可以改為調用atoi()函數。 這是有效的代碼(無錯誤處理):

#include <stdio.h>
#include <stdlib.h>

int addition(int a, int b);

int main(int argc, char *argv[]) {
    if(argc != 3) {
        printf("You must enter 2 numbers!");
        return EXIT_FAILURE;
    }
    else {
        int a = atoi(argv[1]), b = atoi(argv[2]);
        int answer = addition(a, b);
        printf("%d + %d = %d", a, b, answer);
        return EXIT_SUCCESS;
    }
}

int addition(int a, int b) {
    return a + b;
}

輸入“ 2 3”時,輸出為“ 2 + 3 = 5”。


不可理喻:為什么返回時使用TRUEFALSE 為避免幻數,可以使用EXIT_SUCCESSEXIT_FAILURE

首先,您的輸入參數從argv[1] argv[0]始終是您用來調用程序的字符串。

其次(int)*(argv[1])不會將argv[1]從字符串轉換為整數; 它的作用是將argv[1]第一個字符的字符代碼從charint 假設使用ASCII,如果argv [1]為"10" ,則該行會將字符值 '1' (ASCII 49)從char類型轉換為int類型。

您需要使用諸如atoistrtol類的庫函數將參數從字符串轉換為整數,如下所示:

int a = (int) strtol( argv[1], NULL, 10 );
int b = (int) strtol( argv[2], NULL, 10 );
...
int answer = addition( a, b );

閱讀strtol手冊頁以獲取有關參數的說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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