2016-02-29 78 views
0

我正在嘗試編寫一個程序,該程序可以找到最大和最小的10個數字。使用命令行參數的程序中的分段錯誤

要使用我的程序,您必須使用命令行參數-l然後號來確定數量最多,同爲最小號的命令-s。

然而,當我不輸入命令不惜一切,只是嘗試運行該程序,我收到分段錯誤。不知道我錯了哪裏。

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

int main(int argc, char* argv[]) 
{ 
    int i; 
    int min,max,num; 
    char *argv1 = argv[1]; 
    char *small = "-s"; 
    char *large = "-l"; 
    min=max=0; 
    if (0==strcmp(argv1, small)) 
    { 

     for (i=2; i<argc; i++) 
     { 
      num=atoi(argv[i]); 
      if(i==2) 
      { 
       min=num; 
      } 
      else 
      { 
       if(min>num)min=num; 
      } 
     } 
    printf("The smallest number is %d\n",min); 
    } 
    else if (0==strcmp(argv1, large)) 
    { 

     for (i=2; i<argc; i++) 
    { 
     num=atoi(argv[i]); 
     if(i==2) 
     { 
      max=num; 
     } 
     else 
     { 
      if(max<num)max=num; 
     } 
    } 
    printf("The largest number is %d\n",max); 
    } 
    else 
    { 
     printf("Invalid option"); 
    } 
return 0; 
} 

回答

2

在訪問參數之前檢查參數的數量。

int main(int argc, char* argv[]) 
{ 
    int i; 
    int min,max,num; 
    char *argv1 = argv[1]; 
    char *small = "-s"; 
    char *large = "-l"; 
    /* add from here */ 
    if(argc < 2) 
    { 
     fprintf(stderr, "Usage: %s command numbers...\n", argc > 0 ? argv[0] : ""); 
     return 1; 
    } 
    /* add until here */ 
    min=max=0; 
+0

太謝謝你了!我希望有一種方式可以回報你。你一直都在幫我,我真的很感激。 –

+0

@JohnSearcher:請注意,說「謝謝」在這裏的最佳方式是通過了投票權好的問題和有用的答案(一旦你有足夠的聲譽這樣做),並通過接受最有用的答案,你問任何問題(這也給你一個小小的提升,以你的聲望 )。 請參閱[關於]頁面,以及[如何在此處提問 ?]和 [當有人回答我的 問題時,我該怎麼辦? ?(http://stackoverflow.com/help/someone-answers) –

1

你設定char *argv1 = argv[1];沒有檢查argc看到許多論據如何傳遞。這會在您稍後執行if (0==strcmp(argv1, small))時導致段錯誤,因爲argv1未指向您所期望的字符串。

爲了解決這個問題,只是檢查argc你開始任何比較argv1前:

if (argc == 1) 
    { 
     printf("Error: -s or -l required\n"); 
     exit(1); 
    } 
+0

謝謝主席先生! –