2017-12-23 6 views
1

私はstr.cpyを使用して2次元配列を作成しようとしていますが、プログラムは失敗します。コードは4つの配列addを受け取って、その内容を一致する配列にコピーします。C - 2次元配列にstrcpyを使用するには?

int InsertStudent(char *firstName, char* lastName, char* dynCourses, char *dynGrades, 
     char firstNames[50][20], 
     char familyNames[50][20], char courses[50][5][20], 
     char grades[50][5]) 
    { 
     int set, 
     int cset = 0; 
     for (set = 0; set <= (50); set++) 
     { 
      if (firstNames[set][cset] == '\0') 
      { 
       strcpy(firstNames[set][cset], firstName); 
       strcpy(familyNames[set], lastName); 
       for (cset = 0; cset <= 5; cset++) 
       { 
        strcpy(courses[set], dynCourses); 
        strcpy(grades[set], dynGrades); 
       } 

      } 
     } 
     return 0; 
    } 
+3

structを見ましたか?あなたはそれをもう少しオブジェクト指向にすることができます。 –

+1

構造についてまだ学んだことがありますか?おそらくそうではありません。あなたの引数リストが構造体型の単一の配列を叫ぶためです。 'struct Student {char firstName [20]; char familyName [20];チャー・コース[5] [20];チャーグレード[5]; }; ' - あるいは、' struct course {char name [20];チャールグレード; };構造体Student {char firstName [20]; char familyName [20];構造コース[5]}; '。 –

+0

firstname、familyname、grade、およびcoursesという名前のデータ配列はスタック上ですべてローカルなので、データを配置する操作は、そのデータが関数の終了時と同じように「範囲外」になると消えます。 – user3629249

答えて

3
  • まあ、明らかにエラーが誤ってstrcpyを使用しています。

    正しい方法は、慣用Cループは<としない<=を使用して、for (int i = 0; i < MAX; i++)あること

    for (cset = 0; cset < MAX_COURSES; cset++) 
        { 
         strcpy(courses[cset], dynCourses); 
         strcpy(grades[cset], dynGrades); 
        } 
    

    注意なければならないループも

    strcpy(firstNames[set], firstName); 
    
  • あろう。

strcpy関数のシグネチャは

char *strcpy(char * restrict s1, const char * restrict s2); 

が以前あなたが s1文字の代わりに、 char*の代わりに渡されています。何らかの警告が必要です(有効な場合)。そうでない場合は、すべてのコンパイラフラグを -Wall -Werrorに設定します。

   if (firstNames[set][cset] == '\0') 

しかし、あなたが最初に\0とuninitilized値をチェックしている場合。これはうまくいかない可能性が高くなります。文字列を含まないchar配列が0で自動的に初期化されるという保証はありません。だから、確認してください、あなたはループが0からMAX_STUDENTSにあるこの

char arr[20][50]={0}; 
  • のように呼び出し先関数にchar配列を初期化してきました。 MAX_STUDENTSが50以上の場合、配列のインデックスが範囲外になり、未定義のビヘイビアが呼び出されています。MAX_COURSESも同じです。ループがより明確になるのはfor (set = 0; set < (50); set++)です。

  • 初期化とコピーの部分を別々にすると、やはり対処する方がずっと良いでしょう。さもなければ、これは維持するのが難しいでしょう。ご利用coursesを見て

  • あなたがこの

    char courses[5][20]; 
    

同じgrades配列のために行くようにそれを宣言したいことは明らかです。ここでは、文字列を2次元配列にコピーしようとしていました。コンパイラは型の非互換性について文句を言うでしょう。

  • また、この関数では意味がありません。正しい方法は、新しい名前または情報が追加されたインデックス値を返すことです。

  • ここでは、dynGradesdynCoursesの内容をアレイにコピーしています。したがって、それらはすべて同じ値を含みます。これは、あなたの望むことですか?なぜなら、5つの別個のchar配列を保持することが何であるかということです。

+0

修正。これは関数なので、あなたが正しいです、私は戻り値を生徒のインデックスに追加します。 –

+0

@CSstudent: 'struct'の使い方を学ぶことで、より洗練されたソリューションを作ります。 – coderredoc