構造体、ポインタ、scanf関数に関して、エラーが解決できません。

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

構造体、ポインタ、scanf関数に関して、エラーが解決できません。

#1

投稿記事 by diethyl534 » 7年前

末尾にソースコードを載せますので、参照していただければと思います。
プログラムの内容は、ある3人の[名前,年齢,性別]を記述・表示するもので、
3つの構造体を用意し、入力関数・出力関数を呼び出すというものです。

私はMicrosoft Visual Studioを使って練習しています。
下記のプログラムを作ってみたのですが、38行目・40行目(コメントで☆を付けている行)について、
エラーコードC4477が吐き出され、解決できないでいます。
原文ママでエラーコードを載せますと、『 'scanf' : 書式文字列 '%d' には、型 'int *' の引数が必要ですが、可変個引数 1 は型 'int' です』となっています。

自分の解釈ですが、scanf関数は、入力した文字列の格納先としてアドレスを指定する(ポインタを示す)必要があり、そこでエラーが出ているのではないかと思っています。たとえば、変数aに格納するなら「&a」、ポインタ変数pに格納されているアドレスに格納するなら「p」と記述するようにです。
しかし私は構造体に関しては付け焼刃なもので、どうやって直せばよいのかわかりません。構造体の参照として「->」を用いるのはあっているはずなんですが…
それと、なぜその入力関数のnameだけが通っているのかも不思議です。メンバーの型が違うだけでエラーの2つともほとんど同じ様式なのですが…

ご教授のほど、よろしくお願いいたします。

コード:

#include <stdio.h>
#include <string.h>

typedef struct
{
	char name[64];
	int age;
	int sex;
}People;

void structInput(People *date);
void structOutput(People date);

int main(void)
{
	int i;
	People date[3];

	for (i = 0; i <= 2; i++)
	{
		structInput(&date[i]);
	}

	for (i = 0; i <= 2; i++)
	{
		printf("%d人目", i + 1);
		structOutput(date[i]);
	}

	return 0;
}

void structInput(People *date)
{
	printf("名前\n");
	scanf("%s", date->name);
	printf("年齢\n");
	scanf("%d", date->age);       /*  ☆ */
	printf("性別( 0-男性 、 1-女性 )\n");
	scanf("%d", date->sex);                       /*  ☆ */
}

void structOutput(People date)
{
	char sex[32];

	printf("%s", date.name);
	printf("%d", date.age);
	if (date.sex == 0)
	{
		strcpy(sex, "男性");
	}
	else {
		strcpy(sex, "女性");
	}
	printf("%s", sex);

	return;
}

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

Re: 構造体、ポインタ、scanf関数に関して、エラーが解決できません。

#2

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

読み込んだ値をint型のdate->ageに入れてほしいので、これに&をつけた&date->ageを渡します。
date->sexも同様です。

date->nameはchar型を要素とする配列であり、
(sizeofの引数などの例外を除いた)式中では先頭要素へのポインタに変換されます。
scanfの書式%sはchar型の配列の先頭要素を指すポインタを要求する仕様になっており、これは正しいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

超初級者
記事: 56
登録日時: 10年前

Re: 構造体、ポインタ、scanf関数に関して、エラーが解決できません。

#3

投稿記事 by 超初級者 » 7年前

まあどうでもいいっちゃいいんですけど、
人間の属性を格納している変数名が
日付(date)なのはどうしてなんでしょうね。

diethyl534
記事: 3
登録日時: 7年前

Re: 構造体、ポインタ、scanf関数に関して、エラーが解決できません。

#4

投稿記事 by diethyl534 » 7年前

>>みけCAT さん
ありがとうございます、ちゃんと動いてくれました!
structInput関数が引数としてポインタを受け取っていたので、それにメンバーを参照したものを入力先メモリとして入れてやればいいと勘違いしてたみたいです。正しくは、構造体のアドレスを用いた『date->age』が示すものは、構造体Peopleのint型メンバーのageを参照する(単にそこにあるデータ値)ということで、そのアドレスを示すために&を先頭につけてscanf関数の引数とすることで、初めて構造体への入力が可能になるんですね。
ポインタ変数の勉強が足りないみたいなので、振り返ってきます。

丁寧に対応してくださって、ありがとうございました!

diethyl534
記事: 3
登録日時: 7年前

Re: 構造体、ポインタ、scanf関数に関して、エラーが解決できません。

#5

投稿記事 by diethyl534 » 7年前

>>超初心者 さん
いやはやお恥ずかしい限りです。
一つ前に演習していた構造体が帳簿を模したもので、それに引っ張られてデータ(data)のスペルミスという恥ずかしいことになったようです…
とりあえず完成品が動けばいいと思っていたので、今回は良い教訓になりました。
いろいろなプログラム・用語に触れて、「見やすい」ものが作れるよう頑張る所存です。

ご指摘ありがとうございました。

返信

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