• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リストの作成と出力(C言語))

リストの作成と出力(C言語)

このQ&Aのポイント
  • C言語でリストを作成し、出力するプログラムを作成していますが、入力した値が正しく返ってきません。
  • プログラムを改善するために、以下のサイトを参考にしましたが、原因がよくわかりません。
  • プログラムの目的は、入力したデータをリストに追加し、逆順で出力することです。

質問者が選んだベストアンサー

  • ベストアンサー
  • DT200
  • ベストアンサー率38% (63/164)
回答No.1

リストに繋ぐところはOKだと思います。が、データの入力のところの工夫の必要と 出力時の終了の判定に問題があると思います。 参考まで。ちなみにLinux環境で動くことは確認していますが、 Ctrl+Zは使用していません。 #include <stdio.h> #include <malloc.h> #include <unistd.h> #include <string.h> struct tfield{ char name[20]; char tel[20]; struct tfield *pointer; }; struct tfield *talloc(void); int main(void) { struct tfield *head,*p; char buffer[BUFSIZ]; char *p1; head=NULL; while(1){ // name と tel を1行で入力されるためにfgetsを使用する // scanfだとEnterのみの押下を検出できないため。 printf( "name and tel? " ); fgets( buffer, BUFSIZ, stdin ); if( strcmp( buffer, "\n" ) == 0 ){ // Enterキーだけだと"\n"が返る。 break; } //データの入力前にメモリを確保すると、入力の終わりで開放処理を // しなければならなくなるので、データを入力した後でメモリを確保する。 p=talloc(); if( p == NULL ){ // mallocの失敗は必ず判定する事。 printf( "メモリを確保できません。\n" ); _exit( 0 ); } // strtokでnameとtelを分離する。区切りは空白文字またはカンマとする。 // ただし、nameとtelは空白文字がないものとしている。 // 分離できたら構造体に入れる。 // (本来、strtokの戻りがNULLであるか判定するがここでは省略) p1 = strtok( buffer, " ," ); strcpy(p->name, p1); p1 = strtok( NULL, " ,\n" ); strcpy(p->tel, p1); // データをリストに挿入する。 p->pointer = head; head = p; } // リストが作られているか判定する if( head != NULL ){ p=head; do{ // データを出力する printf("%6s %s\n",p->name,p->tel); // ポインタを次のリストに移動 p=p->pointer; } while( p != NULL ); // リストがなければ終了する } // // 本来は確保したメモリの開放を行なう。 // return 0; } struct tfield *talloc(void) /*記憶領域の取得*/ { return (struct tfield *)malloc(sizeof(struct tfield)); }

hisetu_001
質問者

お礼

コメント付で、凄い解りやすいです! 大変感謝です!ありがとうございます<_ _> サイトや参考書見てもソースと解説が別々なのが多く解りにくいので 理解にするのに大変役に立ちました。 ただ、問題にはCtrl+zで終了と変数増やすなとあるので そのとおり作らないと駄目らしいです(何故w)^^; なんとかCtrl+zでやってみます。(fgetsでもEOF判定可能なのでしょうか・・・) ただ、EOFのルールみたいなものが完璧に理解していないので お時間ありましたらご指導お願いします<_ _>

hisetu_001
質問者

補足

質問者です<_ _> 回答ありがとうございました Ctrl+zでの終了条件三時間以上悩みましたが解決できませんでした;; 別途質問することにします。 自己参照構造体とリストの解説ためになりました! ありがとうございました<_ _>

関連するQ&A