2011-02-10 97 views
1

在命令參數中使用無效輸入或-help標誌時,會出現段錯誤。它是Unix expand實用程序的重新創建,它應該以類似的方式處理錯誤。使用無效輸入時出現Segfault

int main(int argc, char *argv[]){ 

    char help1[]= "-help"; 
    char help2[]= "--help"; 

    int spaces; //number of spaces to replace tabs 

    if (argc==1){ //if only one argument in stack 

    //check if asking for help 
    if ((strcmp(argv[1], help1)==0) || (strcmp(argv[1], help2)==0)) 
     printHelp(); 

    else 
     printError(); //otherwise, print error message  

    //right number of tokens are provided, need to validate them 
    } else if (argc>=2){ 
     spaces= atoi(argv[2]); //assign it to spaces 

     parse_file(spaces); //open the stream and pass on 
    }  
    return 0; 

} 

我printerror方法:

void printError(){ 
    fprintf(stderr, "\nInvalid Input.\n"); 
    fprintf(stderr, "The proper format is myexpand -[OPTION] [NUMBER OF SPACES]\n"); 
    exit(1); 
} 

當我嘗試輸入無效或幫助的標誌,我得到一個段錯誤。爲什麼會這樣,因爲我在檢查第一面旗子是否有幫助?

+1

有一段時間沒有做任何C,但不是索引0索引? strcmp(argv [1] ...應該是strcmp(argv [0]等等)? – Gazler 2011-02-10 20:07:53

+1

不,argv [0]是你的可執行文件的名稱 – chris 2011-02-10 20:11:07

回答

5

如果一個命令行參數傳遞給你的程序,argc == 2,所以你需要更換

if (argc==1){ //if only one argument in stack 

if (argc==2){ 

注意,在大多數系統argv[0]是程序名和在這種情況下,argc至少爲1.您可以將argc視爲argv中的元素數。如果你正在爲argv[1]測試,你希望argv至少有兩個元素(argv[0]argv[1]),因此argc需要至少2

3

argv[0]計數,所以,如果argc==1argv[1]NULL

如果有時間不超過2參數,因此

if (argc<3) 
    printHelp(); 
else if(...) 
2

在初始化時應當顯示您的幫助信息,main的參數將滿足以下要求根據this

  • argc大於零。
  • argv[argc]是一個空指針。
  • argv[0]argv[argc-1]是指向其含義將由程序確定的字符串的指針。
  • argv[0]將是一個包含程序名稱或空字符串(如果不可用)的字符串。 argv的剩餘元素表示提供給程序的參數。在只支持單個字符的情況下,這些字符串的內容將以小寫形式提供給程序。

因此,您通過argv[argc](這是一個空指針)到strcmp