正しくコンパイル出来ました。
► スポイラーを表示
コード:
#include <stdio.h>
typedef struct{
char name[64];
int age;
char sex[10];
}student;
void scan_student(student data[]);
void print_student(student data[]);
int main(void){
student data[3];
scan_student(data);
printf("データを出力します。\n");
print_student(data);
return 0;
}
void scan_student(student data[]){
int i;
for (i = 0; i<3; i++){
printf("名前:");
scanf("%s", data[i].name);
printf("年齢:");
scanf("%d", &(data[i].age));
printf("性別:");
scanf("%s", data[i].sex);
}
}
void print_student(student data[]){
int i;
for (i = 0; i<3; i++){
printf("名前:%s\n", data[i].name);
printf("年齢:%d\n", data[i].age);
printf("性別:%s\n", data[i].sex);
}
}
しょうもないところから一つ一つ見ていきますと
まず初めに性別の配列なんですがsex[4]は少なすぎて危険です。
sex[10]でも怪しいのですが…、name[64]のようにすこし大き目にサイズを用意するのが良いと思います
次にscanfなんですが何人かの指摘が入ってますのでそちらを参考に
ちなみにscanfはint scanf(const char* format, ...);のような形式であり、
format:フォーマット指定文字列
…:入力された値を受け取る
アドレスとなっています。
ポインタではざっくり言うと*(間接演算子)を用いずに表記することでアドレスを示すのでscanfでは*を使わない書き方のほうがよいでしょう
また、今回のようにscanfを使用してアドレスを渡す場合、各メンバの型を考慮して引数の指定を行う必要があります。
(たまたま文字列指定%sでは&をつけなくてもよかった。というか&をつけても問題なく動いちゃいますが何故かは自分で確認するといいと思います。)
また、おそらく質問主さんは配列のアドレスのアドレスを引数に渡したいのかなと思ったので、それで考えてみると…やりたいこととは違う気がしますが一応コンパイルは通りました。
► スポイラーを表示
コード:
#include <stdio.h>
typedef struct{
char name[64];
int age;
char sex[10];
}student;
void scan_student(student (*data)[3]);
void print_student(student data[]);
int main(void){
student data[3];
scan_student(&data);
printf("データを出力します。\n");
print_student(data);
return 0;
}
void scan_student(student (*data)[3]){
int i;
for (i = 0; i<3; i++){
printf("名前:");
scanf("%s", (*data)[i].name);
printf("年齢:");
scanf("%d", &((*data)[i].age));
printf("性別:");
scanf("%s", (*data)[i].sex);
}
}
void print_student(student data[]){
int i;
for (i = 0; i<3; i++){
printf("名前:%s\n", data[i].name);
printf("年齢:%d\n", data[i].age);
printf("性別:%s\n", data[i].sex);
}
}
void scan_student(student *data[]);
void scan_student(student (*data)[]);
void scan_student(student (*data)[3]);はどれも別物です。(おそらく三つめしかうまく動作しません)
結合の関係上うまくいかないみたいです