基本: 構造体の配列、関数への構造体の引渡し
基本課題 13..2
name(名前: char型配列), height(身長: float型変数), bloodType(血液型: char型変数)をメンバに持つ構造体を宣言し, 128名分が記憶可能になるようその構造体の配列を定義せよ. また,その配列に対して値を入力し,さらに表示できるようにせよ. 構造体のメンバ値を表示するには、 ひとつの構造体の各メンバの値を表示する関数を作成すること。
% ./bodyData
1人目のデータ: 立命太郎 175.5 A
2人目のデータ: 野路花子 169.0 B
3人目のデータ: 衣笠一郎 180.4 O
4人目のデータ: 0 0 0 ← 0 0 0 と入力すると終わる.
名前 身長 血液型
立命太郎 175.5 A
野路花子 169.0 B
衣笠一郎 180.4 O
%
ヒント: 各人の名前、身長、血液型のデータを1行で入力するためには、参 考12.1に示されたfgets()関数で、これらを1度に取り込 み、最初の空白までを名前とみなし、次の空白までを身長とみなし、次に改行ま でを血液型をみなせばよい。これらを別々の文字列として、必要に応じて整数や 浮動小数点数に変換し、構造体のメンバに設定すること。
ヒント: ひとつの構造体の各メンバの値を表示する関数に構造体を引渡す ことを繰り返えせばよい。
という問題でセグメントエラーが出てどうすればよいのかわかりません。デバッガはなぜかいかれているので質問させていただきます。
私が作ったソースコード↓
#include<stdio.h>
#define SIZE 256
int main(void){
int i;
struct roll{
char name[32];
float height;
char blood[3];
};
struct roll a[30];
for(i=0;;i++){
printf("%d番めのひと",i);
scanf("%s %f %s",a.name,a.height,a.blood);
if(a.name == "0" && a.height== 0 && a.blood=="0" ){
break;
}
}
int j;
for(j=0 ; j<=i ; j++){
printf("名前 身長 血液型 \n");
printf("%s %2s %s \n",a[j].name,a[j].height,a[j].blood);
}
return 0;
}
構造体の配列、関数への構造体の引渡し
Re:構造体の配列、関数への構造体の引渡し
ミスがいくつか…
//scanf("%s %f %s",a.name,a.height,a.blood);
これの「a.height」は前に「&」をつけてあげる必要があります…多分
//if(a.name == "0" && a.height== 0 && a.blood=="0" ){
これは比べれましたっけ…勘違いならすいません
a.name[0]=='0'などに直すと通りました。
//printf("%s %2s %s \n",a[j].name,a[j].height,a[j].blood);
これの「%2s」これは2つの意味で間違ってます。
多分この「2」は小数点以下ではないでしょうか?
その場合「2」ではなく「.2」ではないといけません。
それと「s」ではなく「f」だと思います。
間違ってたらすいません、一応うごきはしました。
//scanf("%s %f %s",a.name,a.height,a.blood);
これの「a.height」は前に「&」をつけてあげる必要があります…多分
//if(a.name == "0" && a.height== 0 && a.blood=="0" ){
これは比べれましたっけ…勘違いならすいません
a.name[0]=='0'などに直すと通りました。
//printf("%s %2s %s \n",a[j].name,a[j].height,a[j].blood);
これの「%2s」これは2つの意味で間違ってます。
多分この「2」は小数点以下ではないでしょうか?
その場合「2」ではなく「.2」ではないといけません。
それと「s」ではなく「f」だと思います。
間違ってたらすいません、一応うごきはしました。
Re:構造体の配列、関数への構造体の引渡し
補足のような形ですが
1、if(a.name == "0" && a.height== 0 && a.blood=="0" ){
break;
}
これは文字列の先頭アドレスと"0"の先頭アドレスを比較しているので一生breakされません
2、height==0 基本的にfloat型は==で比べるのは誤差の関係上あまり好ましくないとされています
1、if(a.name == "0" && a.height== 0 && a.blood=="0" ){
break;
}
これは文字列の先頭アドレスと"0"の先頭アドレスを比較しているので一生breakされません
2、height==0 基本的にfloat型は==で比べるのは誤差の関係上あまり好ましくないとされています
Re:構造体の配列、関数への構造体の引渡し
#include<stdio.h>
#define SIZE 256
int main(void){
int i;
struct roll{
char name[32];
float height;
char blood[3];
};
struct roll a[30];
for(i=0;;i++){
printf("%d番めのひと:",i);
scanf("%s %f %s",&a.name,a.height,&a.blood);←ーーー変更
if(a.name[0] == '0' && a.height == 0 && a.blood[0]=='0' ){←ーーーー
break;
}
}
int j;
for(j=0 ; j<=i ; j++){
printf("名前 身長 血液型 \n");
printf("%s %.2f %s \n",a[j].name,a[j].height,a[j].blood); ←ーーーー
}
return 0;
}
修正しましたが、実行して000または名前・身長・血液型を入力するとセグメンテーションエラーがでます。
どうすればよいでしょうか?
#define SIZE 256
int main(void){
int i;
struct roll{
char name[32];
float height;
char blood[3];
};
struct roll a[30];
for(i=0;;i++){
printf("%d番めのひと:",i);
scanf("%s %f %s",&a.name,a.height,&a.blood);←ーーー変更
if(a.name[0] == '0' && a.height == 0 && a.blood[0]=='0' ){←ーーーー
break;
}
}
int j;
for(j=0 ; j<=i ; j++){
printf("名前 身長 血液型 \n");
printf("%s %.2f %s \n",a[j].name,a[j].height,a[j].blood); ←ーーーー
}
return 0;
}
修正しましたが、実行して000または名前・身長・血液型を入力するとセグメンテーションエラーがでます。
どうすればよいでしょうか?
Re:構造体の配列、関数への構造体の引渡し
パコネコさんが指摘されていた
scanf("%s %f %s",&a.name,a.height,&a.blood);
の部分
a.heightに&がまだついていないと思います
&a.height
scanf("%s %f %s",&a.name,a.height,&a.blood);
の部分
a.heightに&がまだついていないと思います
&a.height