構造体配列をポインタ変数から間接参照したい

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

構造体配列をポインタ変数から間接参照したい

#1

投稿記事 by eupher » 6年前

初めまして。初投稿になりますよろしくお願いします。
C言語学習中のため、誤った言い回し等が多数含まれているとは思いますが、何卒ご容赦いただけると幸いです。

[1] 質問文
 [1.1] 自分が今行いたい事は何か
テキストファイルlist.txtの「番号」「名前」を構造体変数st[]に格納し、都度printf関数でコンソールに出力する問題で、表題のとおり、st[0]のアドレス番地を代入した構造体ポインタ変数ptを利用して解きたいと思っています。
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:

#include <stdio.h>

typedef struct student{
  int id;
  char name[20];
}STUDENT;

int main(void)
{
	int i;
	STUDENT st[10];
	STUDENT * pt = &st[0];
	FILE * fp = fopen("list.txt","r");
	for(i=0; fscanf( fp,"%d %s",&((*pt+i).id),&((*pt+i).name) )!=EOF; i++){
		printf( "%d %s\n",((*pt+i).id),(*pt+i).name );
	}
	fclose(fp);
	return 0;
}
ーlist.txtー
101 tanaka
102 suzuki
103 satoh
以下略

 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載
エラーメッセージは下記のとおりです↓
ファイル「D:/EasyIDEC/project/test008/main.c」の「14行目」で記述エラーを発見しました。
「lvalue」を付け忘れています。
 [1.4] 今何がわからないのか、知りたいのか
fscanf文とprintf文の後ろに何を入れたらいいかが分かりません。
ネットを見たら「ドット演算子ではなくアロー演算子を使え」という記述を多数見かけますが、学校の先生によればドット演算子でもできるそうです。しかし分かりません。

[2] 環境  
 [2.1] OS : Windows10
 [2.2] コンパイラ名 : 学習用C言語開発環境(EasyIDEC)

[3] その他
 ・どの程度C言語を理解しているか
初心者です。

Bull
記事: 149
登録日時: 9年前

Re: 構造体配列をポインタ変数から間接参照したい

#2

投稿記事 by Bull » 6年前

コード:

#include <stdio.h>

typedef struct student {
	int id;
	char name[20];
}STUDENT;

int main(void)
{
	int i;
	STUDENT st[10];
	STUDENT * pt = &st[0];
	FILE * fp = fopen("list.txt", "r");
	for (i = 0; fscanf(fp, "%d %s", &(*(pt + i)).id, &(*(pt + i)).name) != EOF; i++) {
		printf("%d %s\n", (*(pt + i)).id, (*(pt + i)).name);
	}
	fclose(fp);
	return 0;
}
括弧の位置が違ってますね。
'*' と '+' と '.' の優先順位を考慮しないと行けないので、ややこしいですね。
この場合は '[]'演算子を使用して、

コード:

pt[i].id
とした方が簡単でいいと思います。

eupher
記事: 8
登録日時: 6年前

Re: 構造体配列をポインタ変数から間接参照したい

#3

投稿記事 by eupher » 6年前

>Bull様
ご回答ありがとうございます。
早速自分のパソコンで実行してみたところ、無事に目的の動作をしてくれました。

'[]'演算子は初めて目にしましたが、確かにこちらのほうが視覚的に理解しやすいです。
いいことを教えてもらいました、重ねてお礼申し上げます。

また質問した際は是非よろしくお願いします。

Bull
記事: 149
登録日時: 9年前

Re: 構造体配列をポインタ変数から間接参照したい

#4

投稿記事 by Bull » 6年前

解決して何よりですが、このままでは pt を使う意味が無いですね。
次のようにすれば意味が出てくるでしょう。

コード:

#include <stdio.h>

typedef struct student {
	int id;
	char name[20];
}STUDENT;

int main(void)
{
	STUDENT st[10];
	STUDENT *pt;

	FILE * fp = fopen("list.txt", "r");
	for (pt = st; fscanf(fp, "%d %s", &pt->id, pt->name) != EOF; pt++) {
		printf("%d %s\n", pt->id, pt->name);
	}
	fclose(fp);
	return 0;
}

eupher
記事: 8
登録日時: 6年前

Re: 構造体配列をポインタ変数から間接参照したい

#5

投稿記事 by eupher » 6年前

>Bull様
さすがアロー演算子ですね、とても見やすいです。
こちらのコードも試してみたところ上手くいきました。

for文のpt++をみて「え、それでいけるの…?」とも思いましたが、
よくよく考えると&(*(pt + i)).idができるならpt++でも大丈夫ですよね笑

ありがとうございます。すごく為になります。

返信

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