簡體   English   中英

strcmp()的分段錯誤

[英]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個命令行參數來運行它。

您可以通過兩種方式實現此目的:

  1. 主要語法是:

     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]); } 
  2. 第二種技術是使用第二個參數: argv[]是字符串字符串的NULL終止數組,因此argv[argc]始終等於NULL。 您可以在循環中使用此信息來迭代和處理傳遞的參數。

    要理解這一點,假設您正在執行以下功能:

     ./exe firstname lastname 

    然后argv[0] == ./exe argv[1] == firstnameargv[2] == lastnameargv[3] == NULL ,注意這次argc == 3argv[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將是3argv[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.

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