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

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

ただいまの
回答率

91.39%

  • C

    2517questions

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

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

解決済

回答 2

投稿 2017/11/21 21:59 ・編集 2017/11/22 00:06

  • 評価
  • クリップ 0
  • VIEW 116

GASH

score 1

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

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

エラーメッセージ
なし

該当のソースコード

以下、ソースコードです。
#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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

投稿 2017/11/22 10:26

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/22 11:06

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

    キャンセル

  • 2017/11/22 11:18

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

    キャンセル

  • 2017/11/22 13:09

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

    キャンセル

0

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

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


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

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


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


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

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


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

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

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

投稿 2017/11/22 00:40

編集 2017/11/22 00:50

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/22 10:56

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

    キャンセル

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

ただいまの回答率

91.39%

関連した質問

  • 解決済

    スタックの応用

    スタックを利用して入力された文字列の回文を作るプログラムを作成したら、出力されません。 例えば、「abcd」と入力したら、「abcddcba」と主著力される。 発生して

  • 解決済

    cp -r コマンドのC言語による実装

    前提・実現したいこと ls -r コマンドのC言語のソースコードを参考にして cp -r コマンドを実装しているのですが どこを変えていいのかわかりません… 該当のソー

  • 解決済

    c言語 リスト構造の検索

    アドレス帳の検索機能だけのプログラムを作っています。 作りたいプログラムは、  1,検索したい人の名前を入力する  2,事前に登録された情報の中から部分一致検索する 

  • 解決済

    オーバーフローします...

    前提・実現したいこと アルファベット順に表示したいです どうやったらアルファベット順に表示できますか? もし,このままでいいならオーバーフローを直して欲しいです... アル

  • 受付中

    【C言語】冗長だと思う数字入力プログラムを改善したい

    以下のプログラムは3つの数字をスペース区切りで入力して、入力した数字を改行区切りで出力するというコードです。 C言語はあまり慣れていないので、以下のコードに冗長さを感じますが何か改

  • 解決済

    シーザー暗号についての問題

    シーザー暗号についての質問です 大文字を3字ずらす小文字を5字ずらすというプログラムを作っています。 ぶち当たった壁が大文字は3字ずらすことは可能なのですが小文字を5字ずらすことが

  • 解決済

    char型の配列変数にchar型の変数を代入したい

    使用言語 C 環境 Visual Studio 2017 初めての質問です。 独学でプログラミングを始めたのですがわからないところがあり困っています。 char型の配列変数の使い方

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

同じタグがついた質問を見る

  • C

    2517questions

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