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

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

ただいまの
回答率

90.51%

  • C

    4538questions

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

  • ポインタ

    135questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

ポインタでのEOF判定

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,075

ba_max009

score 15

前提・実現したいこと

構造体でポインタの配列を使って文字列を読み込むプログラムなのですが、ポインタ配列をEOFで判定できないとエラーが出てわからなくなりました。
どこが間違っているのか教えてほしいです><

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

pref3main.c: In function ‘main’:
pref3main.c:12:14: error: ‘EOF’ undeclared (first use in this function)
pref3main.c:12:14: note: each undeclared identifier is reported only once for each function it appears in

エラーメッセージ

該当のソースコード

#define N 3
#define LINELEN 128
#define data 47

typedef struct {
  char name[NAMELEN+1];  /* 県名 */
  double area;           /* 面積 (km2)*/
  int population;        /* 人口 (人) */
} pref_t;

pref_t *pref_new(char *name, double area, int population) ;
void pref_print(pref_t* p) ;
pref_t *pref_new_scan(); 



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "pref.h"

int main(void)
{
   pref_t *p[data];
   int i;
   int count=0;

   for(i=0;;i++){
       p[i]=pref_new_scan();
       if(p[i]==EOF){break;}
       count++;
   }

   for(i=count;i>0;i--){
       pref_print(p[i]);
   }

   for(i=0;i<count;i++){
       free(p[i]);
       p[i]=NULL;
   }

   return 0;
}



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pref.h"
#define NAMELEN 15

pref_t *pref_new(char *name, double area, int population){
    pref_t *x;

    //動的割り当て
     x = (pref_t *) malloc(sizeof(pref_t));

     /* 値の代入 */
   strncpy(x->name, name, NAMELEN);
   x->area = area;
   x->population = population;

   return x;
}


void pref_print(pref_t* p){
    printf("%-10s %9.2f %9d\n", p->name, p->area, p->population);
}

pref_t *pref_new_scan(){
    pref_t *p;
    char s[LINELEN+1];

    //動的割り当て
    p=(pref_t*)malloc(sizeof(pref_t));

    if(scanf("%s",p->name)==EOF){return NULL;}
    if(scanf("%lf",p->area)==EOF){return NULL;}
    if(scanf("%d",p->population)==EOF){return NULL;}

    return p;

}
ここにご自身が実行したソースコードを書いてください
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

終了をEOFで判定しているがpref_new_scan()で NULLを返しているのだからNULLで判定する。

int main(void)
{
// ・・・略・・・
       if(p[i]==NULL){break;}

あと、return NULL; の前に malloc()した領域を解放しないと。

pref_t *pref_new_scan(){
// ・・・略・・・
    //動的割り当て
    p=(pref_t*)malloc(sizeof(pref_t));

    if(scanf("%s",p->name)==EOF){free(p);return NULL;}
    if(scanf("%lf",p->area)==EOF){free(p);return NULL;}
    if(scanf("%d",p->population)==EOF){free(p);return NULL;}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

エラー内容をよく読みましょう。

 error: ‘EOF’ undeclared (first use in this function)

だから’EOF'を宣言(declare)していない。
’#defineでEOFを定義すればこのエラーは無くなるでしょう。

また構造体とEOFを比較はできないですよね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

p[i]==EOF
左辺は独自定義した構造体ですよ。EOFと比較するのはおかしいはずです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C

    4538questions

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

  • ポインタ

    135questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。