[英]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”。
不可理喻:為什么返回時使用TRUE
和FALSE
? 為避免幻數,可以使用EXIT_SUCCESS
和EXIT_FAILURE
。
首先,您的輸入參數從argv[1]
; argv[0]
始終是您用來調用程序的字符串。
其次(int)*(argv[1])
不會將argv[1]
從字符串轉換為整數; 它的作用是將argv[1]
第一個字符的字符代碼從char
為int
。 假設使用ASCII,如果argv [1]為"10"
,則該行會將字符值 '1'
(ASCII 49)從char
類型轉換為int
類型。
您需要使用諸如atoi
或strtol
類的庫函數將參數從字符串轉換為整數,如下所示:
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.