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

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

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

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

Q&A

4回答

275閲覧

【C言語初心者】コード修正していただきたいです

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/09/23 10:44

下記コードのどこが間違っているのか教えていただきたいです。

#include<stdio.h> #include<string.h> typedef struct { char name[64]; int age; int gender; }people; int input(int); int output(people,int); int main(void) { people data[3]; int i; for(i = 1;i<=3;i++) { int input(i); } for(i=1;i<=3;i++) { int output(data,i); } return 0; } int input(int i) { ptintf("名前を入力してください。\n"); scanf("%s",data[i]->name); printf("年齢を入力してください。\n"); scanf("%d",data[i]->age); printf("男性なら0、女性なら1を入力してください。\n"); scanf("%d",data[i]->gender); return 0; } int output(people data,int i) { printf("あなたの名前は%sです\n",data[i].name); printf("あなたは%d歳です\n",data[i].age); for(; ;) { if(data[i].gender==0||1) break; printf("男性なら0、女性なら1を入力してください\n"); scanf("%d",data->gender); } if(data[i].gender==0) printf("あなたは男性です\n"); if(data[i].gender==1) printf("あなたは女性です\n"); return 0; }

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

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

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

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

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

yohhoy

2017/09/23 10:50

質問中に「あなたの期待する動作」と「(期待に反する)実際の動き」を説明ください。
LouiS0616

2017/09/23 10:50

どのように上手くいかないのか追記してください。コピペして実行してみる手間が生じますし、質問者様の環境に依存する問題の恐れもあります。
guest

回答4

0

いろいろおかしいです。

  • inputの中でdataを参照している

dataのスコープはmain関数内なので、input関数からは参照できないです。
用途を考えると、ポインタ渡しをするべき場面かと思います。

  • ポインタ変数じゃないのにアロー演算子を使っている

output関数に、dataを値渡ししていますよね。ドット演算子を使いましょう。

  • output関数の呼び出し方がおかしい

引数の型はpeopleなのに、実際にはpeople *を渡しています。
配列の受け渡し方を考え直した方がいいです。


もうちょっと初歩的な部分から勉強した方がいいです。
ポインタに関する基本的な知識が不足しているように思えます。

投稿2017/09/23 11:04

LouiS0616

総合スコア35660

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

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

0

input関数は変数dataを参照できません。
引数で渡す場合、意図した動作を行うには変数の渡し方を気をつける必要があるかと思います。

上記の他、関数呼び出し、配列の添字範囲、論理和判定等の不備が見つかります。

一度に全部を実装しようとせず、まずは最小限の動くコードを作ってから機能を実装してみてはいかがでしょうか。

投稿2017/09/23 10:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

githubのdiff表示

  • L10, 11

 ロジック的にも出力が0以外にならなさそうなのでvoidにしました。
エラーではありません。

  • L16, 20

 C言語の配列は0相対、原点0なので0からスタートします。
個数がnなら条件式は counter < n とするのがお約束です。

  • L18, 22

 これだと処理系によってはint型変数inputをiで初期化することになります。
宣言からコピペする場合は戻り値の型文言を除去します。
input関数内でdataにアクセスできるようで渡します。
配列を変数名だけで渡した場合、配列のトップアドレスが渡されます。

  • L27

 戻りをvoidとし、関数スコープ内で利用しているpeople dataを提供しました。

  • L29

 文言誤りです。

  • L30, 32, 34

 scanfがこちらの環境でセキュリティーエラーになるためscanf_sに差し替えたせいで、
引数構成が若干変わっています。
data[i]はアドレスではなくそのものなので、そのものへのアクセスはドットを使います。

  • L35, 52

 出力しないようにしたので除去しました。

  • L38

 void型にし、people dataを配列でもらうよう変更しました。

  • L42

 ここで求められるアクションだとforよりはwhileを使いますが、
世の仕事では最初forでコーディングしてあったためにこうなることもあります。
0でも1でもない間はループします。

  • L44

 一見バッチリ動きそうですが、1とorするなら条件は永遠に満たされるのでここは無限ループ化
します。
修正後の式がL42に移動していますが、この反転式
((data[i].gender == 0) || (data[i].gender == 1))がここに入ります。
入れる場合はforの中身を抜いて無限ループに戻してください。

  • L46

 配列なのでアクセスしたい1要素を指定します。

まだ文法は把握しきれないと思いますが、エラーが出たらコメントアウトでコードの規模を縮小するなどで範囲を絞り込んでください。
範囲の仮定(単純化)、問題の特定、対処、検証の繰り返しです。

投稿2019/08/28 05:20

編集2019/08/28 05:21
kendji

総合スコア92

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

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

Zuishin

2019/08/28 05:24

退会しているのでもう見てないと思いますし、二年前の質問なので、プログラミングを続けているとしたら同じレベルにはいないと思いますよ。
kendji

2019/08/28 05:27

あれ?w
guest

0

とりあえず、下記の3点確認してください。

・構造体の参照
・ポインタの使い方
・if条件

もう少し基礎を勉強するべきです。
また、
「期待している動作」や
提示しているコードをコンパイルした結果や実行した結果なども
記載することにより、あらためて気づくこともあります。

以上

投稿2017/09/23 16:08

ai_2013_dev

総合スコア338

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問