構造体配列の動的確保

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rika0522
記事: 2
登録日時: 5年前

構造体配列の動的確保

#1

投稿記事 by rika0522 » 5年前

[1] 構造体配列(10領域)を動的確保した後、既に存在しているファイルからデータを読み込み、ターミナル上に出力したいです。(C言語)
[2] 下記のようにソースコードを実行してみたところ、Segmentation fault: 11と出ました。おそらくfor分からが間違っていると思われるのですが、for分を使ってファイル入力処理、標準出力処理を行うにはどうしたらいいでしょうか?

コード:

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

typedef struct person {
  int student_id;
  char name[20];
  char gender;
  int point;
}STUDENT;

int main (void){

    int i;
	STUDENT * st = (STUDENT *) malloc(11 *sizeof(STUDENT));
  
	FILE * fp;
   if((fp=fopen("02student.txt","r"))==NULL);

    for(i=0; i<10; i++){
    	if(fscanf(fp,"%d %s %c %d\n"
    	,st[i].student_id, st[i].name, st[i].gender, st[i].point));
    }

    for(i=0; i<10; i++){
    	printf("%d %s %c %d\n"
    	,st[i].student_id, st[i].name, st[i].gender, st[i].point);
    }

    fclose(fp);
    free(st);  

    return 0;
}

Math

Re: 構造体配列の動的確保

#2

投稿記事 by Math » 5年前

あれまだだれも答えてあげないの。じゃ仕方ないか..
gcc 8.2.0 使用
プログラム
http://www2.koyoen.birdview.co.jp/~abcx ... -26-a-.PNG
実行結果
http://www2.koyoen.birdview.co.jp/~abcx ... -26-b-.PNG


02student.txt

コード:

11 aaa f 10
22 bbb m 20
33 ccc f 30
44 ddd m 40
55 eee f 50
66 fff f 60
77 ggg f 70
88 hhh m 80
98 iii m 90
99 jjj m 91

Math

Re: 構造体配列の動的確保

#3

投稿記事 by Math » 5年前

質問者様のプログラムには 全角スペースが紛れ込んでいるためエラーになったが
それ以外はワーニングはでたけれどエラーにはならずexeはできました。
何も出力はしなかったけど(^^;

box
記事: 2002
登録日時: 14年前

Re: 構造体配列の動的確保

#4

投稿記事 by box » 5年前

コード:

   if((fp=fopen("02student.txt","r"))==NULL);
この文の最後にある謎のセミコロンはどういう意味を持つのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Math

Re: 構造体配列の動的確保

#5

投稿記事 by Math » 5年前

私の答えが読めねえのか。
間違えたにきまってるだろう(^^;

NULL だったら ファイル が読めなかったときの処理を書くべきだわね!

普通VisualStudio Codeにかいてあるようにするだろう。

Math

Re: 構造体配列の動的確保

#6

投稿記事 by Math » 5年前

過去ログに何度も答えているのに参考にしてくださいね。

(過去ログの検索法 わかるよね? 返信ボタンの右にあるよ。)

Math

Re: 構造体配列の動的確保

#7

投稿記事 by Math » 5年前

私のVisualStudio Code でわかるとおもうけど

① ファイルの読み込みの時のエラー処理がぬけてる。

② fscanf の使い方がデタラメ。かなりひどいので 参考書をよく確認する必要があります。

③ malloc は 配列10個 でいいはず。 11個はメモリーの無駄

あとはいいと思いまっせ。

Math

Re: 構造体配列の動的確保

#8

投稿記事 by Math » 5年前

fscanf は
https://bituse.info/c_func/42

ここに説明されてるように
変数のポインタを並べて指定します。つまり 変数の前に & をつけます。
(第1引数にはファイルポインタを指定します。)

Math

Re: 構造体配列の動的確保

#9

投稿記事 by Math » 5年前

正し name は配列なので すでに ポインターです

この辺の事情は
viewtopic.php?f=3&t=20659

をご覧ください。

box
記事: 2002
登録日時: 14年前

Re: 構造体配列の動的確保

#10

投稿記事 by box » 5年前

Segmentation fault: 11と出ました。
あらら。他の回答者からの回答(そのままコンパイルしたら全角空白のためにエラーが出た)と
食い違ってますね。
実行してsegmentation errorが出た、というそのコードを、コピペして見せてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体配列の動的確保

#11

投稿記事 by みけCAT » 5年前

box さんが書きました:
5年前
Segmentation fault: 11と出ました。
あらら。他の回答者からの回答(そのままコンパイルしたら全角空白のためにエラーが出た)と
食い違ってますね。
全角空白があってもそのまま実行できる処理系もあるので、食い違っているとは限りません。
https://wandbox.org/permlink/h55LBXsvMrPFijHU
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

rika0522
記事: 2
登録日時: 5年前

Re: 構造体配列の動的確保

#12

投稿記事 by rika0522 » 5年前

ありがとうございます。参考にさせていただきます。C言語もこのサイトも不慣れな部分が多いので勉強して行きたいと思います。

box
記事: 2002
登録日時: 14年前

Re: 構造体配列の動的確保

#13

投稿記事 by box » 5年前

みけCAT さんが書きました:
5年前
全角空白があってもそのまま実行できる処理系もあるので、食い違っているとは限りません。
https://wandbox.org/permlink/h55LBXsvMrPFijHU
あらら。#3の後で言ってほしかった。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Math

Re: 構造体配列の動的確保

#14

投稿記事 by Math » 5年前

処理系にももちろん依存するし
質問者の環境にもよるね
送ってきたものがコピペとはおもえないね(^^;
エラーからみてメモリー関係だろう … ね!

Math

Re: 構造体配列の動的確保

#15

投稿記事 by Math » 5年前

>バグのないプログラムはない。
>プログラムは思ったとおりには動かない。書いたとおりに動く。

だよねー
だから送ってきたプログラムと質問者様のテストしたのとは 違う(^^;
全角スペース自体コピペではあんまり起きえないもの。

Math

Re: 構造体配列の動的確保

#16

投稿記事 by Math » 5年前

私のもコピペできるようにVisualStudio Code から載せておきますね。(^^;

コード:

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

typedef struct person {
  int  student_id;
  char name[20];
  char gender;
  int  point;
}STUDENT;

int main (void){
    int i;
    STUDENT * st = (STUDENT *) malloc(10 * sizeof(STUDENT));
    FILE * fp;
    if((fp=fopen("02student.txt","r"))==NULL){
        printf( "file cannnot open\n" ); return -1; }

    for(i=0; i<10; i++){
        fscanf(fp,"%d %s %c %d"
            ,&st[i].student_id, st[i].name, &st[i].gender, &st[i].point);
    }
    for(i=0; i<10; i++){
        printf("%d %s %c %d\n"
            ,st[i].student_id, st[i].name, st[i].gender, st[i].point);
    }

    fclose(fp);
    free(st);  

    return 0;
}

返信

“C言語何でも質問掲示板” へ戻る