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

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

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

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

解決済

C言語 自己参照構造体のエラー改善について

ccodereader
kimrisa_

総合スコア7

C

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

2回答

0評価

0クリップ

303閲覧

投稿2022/05/14 05:03

プログラミング初心者です。
C言語の課題で調べながらやっているのですが、エラーが続き泣きそうです。
ヒントだけでも頂けると非常に助かります。

【 課題文 】 :

自己参照構造体を使って単語を登録するプログラムを作りましょう.forを使った繰返しの中でfgetsを使って単語を入力します.Control-Dキーが入力されたら繰返しから抜け出し,登録した単語を順番に表示します.あらかじめ繰返しの数が分かっていないので,動的にメモリを確保する必要があります.Control-D が入力されると,fgets はファイル(標準入力) が終りになったと判断し,NULLポインタを返すので,それによって入力の終了をプログラム中で検出できます.

1行入力のために用意するchar 型の配列の大きさは、マクロで定義し、1024としてください。1行入力はfgetsを用い、行末の改行文字(\n)は、strchr()を用いて検出し、取り除いてから処理するようしてください。また、自己参照構造体は、以下のようにしてください。

struct list { struct list *next; char *name; };

control-dの検出は、fgets()の返値をNULLと比較して行ってください。

char *p; ... for(;;){ p = fgets(.....); if(p == NULL){ break; } ... }

プログラムを動作させ、キーボードから何行か入力して最後にcontrol-d(CTRL-D, ^D)を入力すると、以下のように入力された文字列がそのまま入力した行の順番に表示されるようにしなければならないようです。

%./kadai ABC 123 XYZ ^D ABC 123 XYZ %

【 現状 】 :

#include <stdio.h> #include <string.h> #include <stdlib.h> //1行入力のために用意するchar型の配列の大きさはマクロで定義し1024 #define MAXLINE 1024 //自己参照構造体を定義 struct list { struct list *next; char *name; }; int main(){ char input[MAXLINE]; //構造体型のポインタ char *p, *start; //forを使った繰返しの中でfgetsを使って単語を入力 for(;;){ p = fgets(input,MAXLINE,stdin); //pがNULLの時、入力の終了 if(p == NULL){ break; } p = strchr(input,'\n'); if(p != NULL){ //1回目のループ -- 先頭の構造体を生成 p = malloc(sizeof(struct list)); start = p; }else{ //2回目以降 -- 構造体へのポインタを next に保存 p -> next = malloc(sizeof(struct list)); p = p -> next; p->next = NULL; printf("input=%s",input); } exit(0); } }

エラー
?「char」が構造または結合ではないのようなことが書いてあるが、どう改善したら良いか分からない。
? 構造体をつなげる部分をどうすれば良いのかよく分からない。

05.c:38:9: error: member reference base type 'char' is not a structure or union p -> next = malloc(sizeof(struct list)); ~ ^ ~~~~ 05.c:39:13: error: member reference base type 'char' is not a structure or union p = p -> next; ~ ^ ~~~~ 05.c:40:8: error: member reference base type 'char' is not a structure or union p->next = NULL; ~^ ~~~~ 3 errors generated.

よく分からないコードになってしまっているかと思いますが、
どうか温かい目でご教授お願い致します。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

ccodereader

2022/05/14 05:10

その他で、あまりよく分からない部分です。余力があれば教えて頂けると嬉しいです。 ? MAXLINEでいいのかどうか。 ? printfの部分はこの場合、どのように書くのが正解かよく分からない。 ? char *p, *start;の部分で、*startは書かずにchar *pだけでもいいのかどうか。
dodox86

2022/05/14 06:02

理解していないのに最初から全て、完成形のコードを目指さない方がいいです。分からないところをひとつひとつ片付けましょう。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C

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