2016-11-05 14 views
0

私は関数を少し良くし、有用なものを書くことができ、再帰的であり、プログラムに与えられた番号のリストを並べ替えるようにしようとしています。しかし私はここでセグメンテーションフォルトを得ています。私がargv[i+1]を読むときにこれが起こっていると感じるのは、私がargv[]の項目を使い果たしたときです。しかし、私のif(i < argc){ステートメントでこれをチェックしても、なぜこのことが起こらないのですか?セグメンテーションフォールトを与える基本ブール関数

ここに私のコードです。

#include <stdio.h> 
#include <ctype.h> 
#include <math.h> 
#include <string.h> 
#include <stdbool.h> 

bool compare(val1,val2) 
{ 
    if(val1 > val2){return false;} 
    else{return true;} 
} 

// int values[], int n 
int main(int argc, char *argv[]) 
{ 
    for(int i=1; i<argc; i++){ 
     //print unsorted list 
     printf("%s\n",argv[i]); 
     if(i < argc){ 
      if(compare(*argv[i],*argv[i+1])) 
      { 
       printf("true\n"); 
      } 
      else 
      { 
       printf("false\n"); 
      } 


     } 
     // Add else for odd numbered lists 
    } 

    return 0; 
} 
+2

もし '私==のargc - 1 '、' ARGVは、[I + 1]は '未定義です。 –

+0

あなたのフィードバックに感謝しました。 – Gates

答えて

1

argv[i+1]が定義されていません。例えば

、次の2つの引数(argv[0]argv[1]、およびargv[2]が定義されている)を使用している意味argc=3場合。 i2に等しい場合、argv[i+1]に電話するとargv[3]にアクセスしようとしています。

forを再定義してif(i < argc)を削除するだけで済みます。

あなたのコードは次のようになります。

for(int i=1; i < argc-1; i++){ 
    //print unsorted list 
    printf("%s\n",argv[i]); 
    if(compare(*argv[i],*argv[i+1])) 
     printf("true\n"); 
    else 
     printf("false\n"); 
} 
2

なぜこれをチェックする私のif(i < argc){文が起きてからこの を排除するものではありませんか?

この文では、iがargcよりも小さい場合はコードを続行できます。引数の数。 3つの引数があり、2以下の値で進めることが許されているとしましょう。

次の行では、argv [i + 1]にアクセスしようとしています。私は2になることができたので、インデックス3のアイテムにアクセスしようとしています。インデックスに登録されていて3つのアイテム(0,1,2)があるので、存在しない。 i==argc-1場合

if(compare(*argv[i],*argv[i+1])) 
関連する問題