2017-12-17 19 views
1

私の大学のCで割り当てられた学生データベースを構築中です。 問題を見つけられませんでした。 ここに私のコードです:基本的に2次元配列内の文字列を関数内で比較する

void sortArrays(char names[max_n_students][max_name_student],int counter) 
{ 
int i, j; 
if (counter > 1) // means more than 1 course is in the database 
{ 
    for (i = 0; i < counter; i++) 
    { 
     for (j = 1; j < counter; j++) 
     { 
      if (strcmp(names[i], names[j]) > 0) /* problem here? */ 
      { 
       swapArrays(names[MAX_STUDENTS][MAX_NAME], i, j); 
      } 
     } 
    } 
} 
} 

、私がやろうとしていることは、インデックスによって関数内の2つの文字列を比較することである(文字列の2次元配列)、および戻り値がある場合は> 0それらの名前を置き換えるswap関数を実行します。しかし、私は例外の警告を受け取ります。 問題点を教えていただけますか?

後、私は自分の成績を交換する必要が名を入れ替えるので、私はむしろ、「おそらく

+0

例外の警告は何ですか?あなたの 'j'は' j = i'noで始まるはずですか?もしそうなら、あなたの最初の条件は 'i LenweSeregon

+0

https://imgur.com/1ELVUhu @LenweSeregon here mate。 –

+0

ああ、ビジュアルスタジオデバッガは分かりませんが、初期化されていない文字列やそのような文字列を比較しようとしているようです。動的割り当てを使用しましたか、 'names'は静的配列ですか? sortArraysを呼び出す関数を表示できますか?そして同時にあなたの名前配列を初期化する場所。 – LenweSeregon

答えて

0
  1. など、ここにはstrcmpを最後の名前を、それを使用しないと思いますが、私は、ポインタの基本的なアイデアを得ました"犯人/悪用されています。両方の名前がnameに割り当てられたchar配列を完全に満たす場合、strcmpは配列を超えたメモリ範囲にアクセスしようとします。代わりにstrncmpを使用することを検討してください。
  2. 問題が発生していない可能性がありますが、最初に状態が重複しているように見える場合があります。 2番目のループのjの初期化はI + 1であり、終了条件はj < counter -1です。これは文字列で使用される選択ソートとして表示されます。
関連する問題