質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

3回答

1049閲覧

C言語:簡単な構造体について

yutarokon

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/10/30 10:19

前提・実現したいこと

C言語での構造体で、入力したデータ(男か女)に当てはまる時にそれを取り出し表示させたいです。

発生している問題・エラーメッセージ

性別は?> 男 1 渡辺一夫 16 男 0 0 3 篠田浩二 17 男 4 遠藤雄一 19 男 性別は?> 女 0 0 2 浅田裕子 20 女 0 0

のように、必要ないデータも0として表示されてしまいます。

該当のソースコード

C

1#include<stdio.h> 2#include<string.h> 3struct student{ 4 int no; 5 char name[20]; 6 int nenrei; 7 char seibetu[20]; 8}; 9 10int main() 11{ 12 int i, cnt = 0; 13 char str[20]; 14 struct student kekka[256]; 15 struct student data[5] = { 16 {1, "渡辺一夫", 16, "男"}, 17 {2, "浅田裕子", 20, "女"}, 18 {3, "篠田浩二", 17, "男"}, 19 {4, "遠藤雄一", 19, "男"}, 20 {5, "堀田美香", 18, "女"} 21 }; 22 printf("性別は?> "); 23 gets(str); 24 25 for(i=0; i<5; i++){ 26 if(! strcmp(str, data[i].seibetu)){ 27 kekka[i] = data[i]; 28 cnt++; 29 } 30 } 31 for(i=0; i<=cnt; i++){ 32 printf("%d ", kekka[i].no); 33 printf("%s ", kekka[i].name); 34 printf("%d ", kekka[i].nenrei); 35 printf("%s \n", kekka[i].seibetu); 36 } 37 return 0; 38}

試したこと

どうしてこうなるのかはなんとなくは分かりますが、どう対応したらいいのか分かりません。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ぱっと見これで動きそうですが未検証です。

修正1

kekka[cnt] = data[i];

修正2

for(i=0; i<cnt; i++){

投稿2018/10/30 20:16

opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOshim

2018/11/02 16:15

これだけでOKですね。プログラムって面白い。
guest

0

2か所ほど間違いがあります。

1か所は、dice142さんが指摘している箇所です。
残りの箇所は、結果を表示する為のfor文です。

コメントへの回答

悪い方へ修正しているようですね。
他回答者が、すでに回答していますので
デバッグする方法を紹介します。

kekka配列の期待値があると思います。
その期待値になるために、どのような添え字で
kekka配列に設定するかと思いますので

iとcntの値を確認すれば、kekka[i]が不向きであることが
わかると思います。

for(i=0; i<5; i++){ if(! strcmp(str, data[i].seibetu)){ printf("i: %d cnt:%d\n", i, cnt); kekka[i] = data[i]; cnt++; } }

printfを入れてデバッグすれば良い。。。

投稿2018/10/30 11:20

編集2018/11/01 11:04
ai_2013_dev

総合スコア338

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutarokon

2018/10/30 13:51

ありがとうございます。 for(i=0; i<5; i++){ for(j=i+1; j<5; j++){ if(! strcmp(str, data[i].seibetu)){ kekka[j] = data[i]; cnt++; } } } for(j=1; j<cnt; j++){ printf("%d ", kekka[j].no); printf("%s ", kekka[j].name); printf("%d ", kekka[j].nenrei); printf("%s \n", kekka[j].seibetu); } return 0; このようにしてみたのですがダメみたいです...
guest

0

C

1 for(i=0; i<5; i++){ 2 if(! strcmp(str, data[i].seibetu)){ 3 kekka[i] = data[i]; 4 cnt++; 5 } 6 }

この部分で、dataの要素番号と同じ番号のkekkaに入れているのが原因です。
dataはそれぞれ見ていくのに対し、kekkaは一致したときだけ要素番号が進む必要があるので
同じ変数iを使わずに、別々の変数を使う必要があります。


[追記]

** data[] **

要素番号nonamenenreiseibetu
01渡辺一夫16
12浅田裕子20
23篠田浩二17
34遠藤雄一19
45堀田美香18

↑このようにあるものから

** kekka[] **

要素番号nonamenenreiseibetu
01渡辺一夫16
13篠田浩二17
24遠藤雄一19

このように別な配列に格納されますが、
2つの配列の要素番号は一致しているものもあれば一致していないものもあります。
適当に並び替えたデータで考えると、data配列とkekka配列の各要素の番号に
数列的な規則性はありません。
つまり、不規則に格納されるkekka配列の要素番号に
for文のカウンタ変数は使うべきではありません。

kekka配列は条件に合うときだけ要素が追加されるもので、
そのときにkekka配列の次の要素を指す要素番号を変えていきます。
その値を使用すれば良いのです。

投稿2018/10/30 10:30

編集2018/10/31 02:09
dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutarokon

2018/10/30 12:53

回答ありがとうございます。 しばらく考えてみたのですが...分かりませんでした。 もう少し詳しく教えていただいてもよろしいでしょうか?
dice142

2018/10/31 02:09

回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問