質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.83%

  • C

    3351questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

構造体配列の個数をscanf関数で設定したい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 163

nissei

score 25

初歩的な事かもしれないですが、構造体を設定。

struct SEITO {
    char namae[30];
    int kokugo;
    int sugaku;
    int eigo;
    int goukei;
    float heikin;
};


その後に。。。

    int member = 0, subject = 0, OK = 0;
    while (OK == 0) {
        printf("人数は何人ですか?\n");
        scanf("%d", &member);
        printf("何教科ありますか?\n");
        scanf("%d", &subject);
        printf("人数%d人\t教科は%d種目\tでいいですか?\n", member, subject);
        printf("はい=1\tいいえ=0\n");
        scanf("%d", &OK);
    }

と人数と科目数をscanf関数で値を設定し、

    SEITO Std[member];

と初期化したいのですが、上記の「SEITO Std[member];」
のmemberの部分がエラーの赤波線が発生し、「式には定数値が必要です」っと
出てしまいます。
c言語ポインタ完全制覇という参考書のP.84に同じ様にscanf関数で値を設定し、その変数を配列の個数に設定(可変長配列の宣言)しています。

なぜエラー表示が出てしまうのか理解に苦しんでいます。

その違いと私が書いたコードはどの様に書き直したらいいのか教えて頂きたいです!
宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

C言語は動的配列をサポートしていません。
C++ならできます。
C言語で目的を達成したい場合は、malloc等で動的にメモリを確保する必要があります。

// ポインタで宣言
SEITO *pStd

// 動的メモリ確保
pStd = (SEITO*)malloc(sizeof(SEITO) * member);

// pStd[0].kokugo = 0;

// メモリの解放を忘れずに
free(pStd);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/24 14:52

    あまりメジャーでないとはいえ、機能としては存在しています。

    キャンセル

  • 2018/04/24 14:55

    お早い解答ありがとうございます。
    上記の様にコードを書いてみたのですが、「malloc」、「free」の記述部分でエラーが出てしまいます。
    私の書いてる場所が間違っているのか見当がつきません。

    キャンセル

  • 2018/04/24 14:59

    >nisseiさん
    stdlib.hをインクルードする必要があります。
    以下を追加してみてください。
    #include <stdlib.h>

    キャンセル

  • 2018/04/24 15:01

    >maisumakunさん
    やはりありましたか。
    あったような気はしたのですが、確かめずに回答してしまいました。
    どっちみちC言語では使えない(使えても使わない)と考えておいたほうがよいかと思いましたので。

    キャンセル

  • 2018/04/24 15:07

    エラーがなくなりました!!
    ありがとうございます!

    今後の為に確認でお聞きしたいのですが、
    質問に書いてあった「SEITO Std[member];」が「SEITO *pStd;
    」に変わったという事ですね?
    それと、「free(pStd);」の
    意味と書く場所などの注意点を教えてほしいです。

    キャンセル

  • 2018/04/24 15:17

    mallocをするとメモリ上に領域が確保されます。
    freeはそれを解放して他のプログラムが使えるようにする状態にします。
    なのでその領域はもう使わないってタイミングでfreeすればよいです。
    malloc/freeの使い方については一度ご自分で調べてみることをおすすめします。

    キャンセル

  • 2018/04/24 15:19

    ありがとうございました!!!

    キャンセル

+1

C99以降(C11以降ではオプションとなりましたが)には、可変長配列の機能があります。コンパイラオプションで有効にできないか確認してみましょう。

C言語(C11)で可変長の配列を使う方法

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/24 15:31

    勉強になる記事の欄を添付してくださって本当に感謝です!!
    ありがとうございます!^^

    キャンセル

0

解決済みとなったようですが。

いずれの回答にも可変長配列についての言及がありますが、今回のような配列の個数がわからないのにはちと不適当ではないかと考えます

可変長配列ってのはスタック上に確保されるため、最初の配列の個数入力でヘタな値を入れられると、暴走するおそれがでてきますね。
って、いまどきのPCのようなリッチな環境では滅多なことはないのでしょうが、そんでもキモチワルイですねー

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/24 15:31

    まだまだ未熟ゆえ、勉強不足でしたがありがとうございます。

    キャンセル

  • 2018/04/24 15:36

    可変長配列ってのはあくまでAUTO変数となりますんで、サイズには要注意ですね

    キャンセル

  • 2018/04/24 15:38

    やはりcでこの様なプログラムは時代遅れなのでしょうか?^^;
    c#やJavaなのかな~って思う時がありますw

    キャンセル

  • 2018/04/24 15:45

    まあ、組み込み系とかArduinoとかではまだまだCは必須となりますが、
    PC上で走らせるなら、C#とかJavaがいいですねー

    キャンセル

  • 2018/04/24 15:53

    一様、C#とJavaも並行して勉強していますが、「Cを使えれば最強(どの言語にも活かせる)」と講師より教えられたので、今は6~7割cを勉強しています(^^;
    ありがとうございますw

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3351questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。