2017-10-31 20 views
-2

私はポインタを使用して構造体に2次元配列を作成しようとしています。これは、私が新しいのでポインタのトピックでかなり混乱します。助けてください!構造体Cの文字列の2次元配列

struct course 
{ 
    char *coursecode; 
    char *coursesession[5]; 
}; 

int main() 
{ 

    int n = 0; 
    int numSession = 0; 
    struct course *main = malloc(sizeof(struct course)); 



    printf("Enter the course code and the session in this order:"); 
    scanf("%s", main->coursecode); 
    printf("Enter the number of session required:"); 
    scanf("%d", &numSession); 
    for (int i = 0; i < numSession; ++i) 
     { 
      printf("Enter the session code (M1...):"); 
      scanf("%s", main->coursesession[i]); 
     } 
    ++n; 
} 

答えて

1

あなたはcharへのポインタであることをcoursecodeを宣言しましたが、あなたはmallocで行うことができ、そのためのスペースを割り当てる必要があります。

そしてcoursesessionは、charへの5つのポインタの配列であると宣言しました。あなたはすべての5つのポインタのために、mallocで再びスペースを割り当てる必要があります。

また、両方を配列として宣言することもできます(例:

struct course 
{ 
    char coursecode[100]; 
    char coursesession[5][100]; 
}; 

これは100 charの5つの配列の配列であるため100 char、及びcoursesessionの配列であることがcoursecodeを宣言する。もちろん、100を必要に応じて調整することもできますが、ストレージサイズは関係なく固定されます。

+0

おかげのようにコードを変更することができます! – madness

+0

しかし、その場合、どのようにユーザーからの入力を得ることができますか? – madness

+0

@マッドネスあなたは、ポインタケースか固定サイズの配列ケースのどちらをお求めですか? –

0

あなたはそんなにこの

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


struct course 
{ 
    char *coursecode; 
    char *coursesession[5]; 
}; 

int main() 
{ 

    int n,i = 0; 
    int numSession = 0; 
    struct course main; 

    main.coursecode = (char *)malloc(100*sizeof(char)); 
    printf("Enter the course code and the session in this order:"); 
    scanf("%s", main.coursecode); 
    printf("Enter the number of session required:"); 
    scanf("%d", &numSession); 
    for (i = 0; i < numSession; ++i) 
    { 
     printf("Enter the session code (M1...):"); 
     main.coursesession[i] = (char *)malloc(100*sizeof(char)); 
     scanf("%s", main.coursesession[i]); 
    } 
    ++n; 
    free(main.coursecode); 
    for (i = 0; i < numSession; ++i){ 
     free(main.coursesession[i]); 
    } 
} 
+1

'malloc'はCでは必須ではないので、キャストしないでください。' malloc(100 * sizeof(char)) 'のように固定サイズのバッファを使用する場合は、 'scanf'を使わないでくださいバッファオーバーランが発生する可能性があります。 – MFisherKDX

+1

@MFisherKDX - 「固定サイズのバッファ」で 'scanf()'を使うのは良いですが、バッファオーバーフローを避けるためにフォーマット文字列に最大フィールド幅を指定する必要があります。 'scanf("%99s "、main.coursesession [i]);'。 –

関連する問題