[英]Segmentation fault with strcmp()
if(strcmp(argv[2], NULL) == 0)
我傳遞了3個命令行參數,但我也想用上面的語句只用2個命令行參數來運行它。 但是正在顯示分段錯誤錯誤。
我也嘗試過
if(argc < 3)
但它也沒有用......同樣的分段錯誤......
為什么分段錯誤?
由於代碼if(strcmp(argv[2], NULL) == 0)
,你將NULL作為字符串指針傳遞給strcmp()
函數; 嘗試在NULL處進行deference以比較字符代碼(例如acsii代碼),這會在運行時導致未定義的行為。
您應該使用==
將字符串指針與NULL進行比較, if(argv[2] == NULL)
我傳遞了3個命令行參數,但我也想用上面的語句只用2個命令行參數來運行它。
您可以通過兩種方式實現此目的:
主要語法是:
int main(int argc, char* argv[])
第一個參數argc
是參數計數器,它是傳遞給您的進程的參數總數,包括進程名稱。
所以當你沒有傳遞額外的參數時, argc == 1
例如./exe
假設您傳遞三個參數如下:
./exe firstname lastname
然后argc == 3
,看起來你傳遞了兩個參數,但是包含可執行文件名,你實際上是要傳遞三個參數進行處理。
所以你可以使用argc
值來循環迭代來打印傳遞的參數(其他可執行文件)
printf("Process name is: %s", argv[0]); for(i = 1; i < argc; i++ ){ printf("argv[%d] %s\\n", argv[i]); }
第二種技術是使用第二個參數: argv[]
是字符串字符串的NULL終止數組,因此argv[argc]
始終等於NULL。 您可以在循環中使用此信息來迭代和處理傳遞的參數。
要理解這一點,假設您正在執行以下功能:
./exe firstname lastname
然后argv[0] == ./exe
argv[1] == firstname
和argv[2] == lastname
和argv[3] == NULL
,注意這次argc == 3
( argv[argc]
表示argv[3]
== NULL)。
例如,要打印所有參數,您可以編寫如下代碼:
int i = 1; printf("Process name is: %s", argv[0]); while(argv[i]){// terminates when argv[i] == NULL printf("argv[%d] %s\\n", argv[i]); i++; }
您是否注意到argv[0]
始終是您的可執行文件名稱! 這意味着每當您需要打印可執行文件名時,在編寫代碼時使用argv[0]
而不是可執行文件的硬代碼名稱,這樣如果您重新編譯並為您的可執行文件賦予新名稱,則argv[0]
始終打印正確的名稱。 您應該編寫如下代碼:
int main(int argc, char* argv[]){
:
:// some other code
if(argc < min_number_of_arguments){
fprintf(stderr, "Error: wrong number of arguments passed!\n");
fprintf(stderr, "Usage: %s [first] [second] \n", argv[0]);
exit(EXIT_FAILURE);
}
:
:// some other code
return EXIT_SUCCESS;
}
您不能使用strcmp()
來比較NULL
。 兩個參數都不能為空。 在這種情況下,它無論如何都沒有意義。 如果參數不存在,則argc
將為<3,如果它以某種方式為空,則它將為零長度。 永遠不會。
首先,您應始終使用strcmp(some_string, "")
而不是strcmp(some_string, NULL)
來檢查字符串是否為空。
但是在你的問題中你應該測試
if (argc < 4)
那是因為可執行文件本身也在數組argv
。 考慮你正在調用類似./a.out param0 param1
東西,然后argc
將是3
而argv[0]="./a.out"
, argv[1]="param0"
, argv[2]="param1"
。
編輯:
另外,永遠不要直接測試if(strcmp(argv[2], NULL) == 0)
。 始終先測試argc
。 由於沒有受讓人在argv[argc+n]
存儲的值為n >= 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.