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

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

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

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

Q&A

解決済

2回答

3900閲覧

【C言語】else if文の中のstrcmpを機能させたいです。

GASH

総合スコア8

C

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

0グッド

0クリップ

投稿2017/11/21 12:59

編集2017/11/21 15:06

###発生している問題・エラーメッセージ
お世話になります。
現在、私が解きたいのは以下の例題です。
「コンソールより氏名、生年月日を入力させて、年齢を出力する。
また、再度起動時に同一氏名入力時は生年月日と年齢を出力する。」
しかし、『再度起動時に同一氏名入力時は生年月日と年齢を出力する。』
が出来ないまま、『氏名、生年月日の入力⇒年齢の出力』のループを繰り返してしまいます。
是非、ご教授頂ければと思います。よろしくお願い致します。

エラーメッセージ なし

###該当のソースコード

以下、ソースコードです。 #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma warning(disable:4996) int main(void) { FILE *fp; char name[256]; int year,month,day; int year2,month2,day2; int y; year=0; month=0; day=0; year2=0; month2=0; day2=0; y=0; for (int i=0;;i++){ /*名前入力*/ printf(" あなたの氏名は ? "); scanf_s("%s",name); /*ファイル入力*/  fp= fopen("a.txt","r"); char cBuf[256]; memset(cBuf,0x00,sizeof(cBuf)); fgets(cBuf,sizeof(cBuf)-1,fp); /*ファイルがNULLの時*/ if(fp==NULL){ printf("ファイルをオープンできません¥n") return -1; } /*ファイルがNULLじゃない時*/ else if(fp != NULL){ /*名前一致*/ if(strcmp(cBuf,name))==0){ fprintf(fp,"あなたは%d年%d月%d日生まれの%d歳ですね¥n",year,month,day,y); break; } /*名前が不一致*/ else{ while(fgets(name,256,fp) != NULL){ printf("%s",name); } } /*生年月日入力計算*/ printf(" 生年月日? "); fflush(stdin); scanf_s("%d %d %d",&year,&month,&day); year2=2017; month2=11; day2=21; y=year2-year; if(month2 < month){ y--;} else if(month2==month && day2 < day){ y--;} printf("あなたは%d歳ですね¥n",y); /*ファイル出力*/ fp = fopen("a.txt","w"); if(fp == NULL){ printf("ファイルをオープンできません¥n"); return 1; } else if(fp != NULL){ fprintf(fp,"%s,%d,%d,%d,%dn",name,year,month,day,y); fclose(fp); } } } }

###試したこと
課題に対してアプローチしたこと
再度起動の方法が分からず、if文やwhile文、goto文など試してみたが上手く行かなかった。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
言語:C/ツール:VisualStudio2008

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

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

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

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

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

guest

回答2

0

ベストアンサー

「if文やwhile文、goto文など試してみ」るというレベルの人が取り組む例題ではないです。難しすぎます。もっと基礎的な処に戻ってやり直すことをお勧めします。

たとえば、ファイルを読み出した後にファイルのオープンが成功したかどうかのチェックをしていますよね。ファイルのオープンに失敗したらそれは読み取れない。

if(fp==NULL){略}
else if(fp != NULL){
のelseifは全く無意味な条件ですし。

投稿2017/11/22 01:26

a_saitoh

総合スコア702

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

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

GASH

2017/11/22 02:06

回答ありがとうございます。 そうですね、まだ基礎的なことが身に付いていないという自覚はあります。 正直な話、C言語を始めて2週間程度の自分には難しいんじゃないかと思ってはおりましたが・・・・・・ただ、取り組まなくてはいけないのが辛いところですね。基礎からおさらいしてみますね。
a_saitoh

2017/11/22 02:18

プログラミングの練習のためにあえてCライブラリだけ使って手で書いてもいいですが、こんなことを実用アプリでやりたいならデータベースを使うかどうか本気で検討する題材です。複数人のデータを処理する課題なら。 「一人のデータを入れて計算させて終了、前回のデータは参照するが前々回のは忘れていい」ならまぁまぁ簡単。
GASH

2017/11/22 04:09

やはり難易度が低くはない課題なのですね。 未経験でも1日で解ける人も居ると言われたので、内心かなり焦っていましたが、少し安心しました。 大変そうですが、諦めずに頑張ってみます。
guest

0

文法エラーあるのでこのソースでビルドできるわけはないのですが、仮に動いたとしても書いてる通りのループになりますね。
課題のようなのでヒントだけ

C

1 for (int i=0;;i++){

これでまずは永久ループの可能性がある

C

1fgets(cBuf,sizeof(cBuf)-1,fp);

C

1 fprintf(fp,"%s,%d,%d,%d,%dn",name,year,month,day,y); 2

でファイルに記述されてるのでfprintfに対応した読み込み方法である必要があるはず(多分fprintfと同じ時かその後に習ってるはず)

C

1 /*名前が不一致*/ 2 else{ 3 while(fgets(name,256,fp) != NULL){ 4 printf("%s",name); 5 } 6}

これをしてるから私的にはファイルには誕生日データが複数できるものと思ってたけど仕様がわからないので不明

  • 再度起動

これはただ単に2回目実行(もう少し正確にはファイルが無いときに実行するのが1回目、ある時に実行するのが2回目)のときの意味合いのはず(上記してる通り永久ループする可能性があるから終わらない可能性があるけど・・・)

まあさくっとこれぐらい上げておきます。

投稿2017/11/21 15:40

編集2017/11/21 15:50
rururu3

総合スコア5545

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

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

GASH

2017/11/22 01:56

回答ありがとうございます。 fgetsに関しては、今後使う可能性が高いと言われたfreadで書き換えられるように試してみます。 ループに関しては、「そもそもファイルをオープン出来ないと、ループの意味が無い」と言われたので、一旦置いておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問