
こんにちは<_ _>
リストの問題についてなのですが出力と逆順に出力するプログラムで
headと前のデータの間に新しいデータを追加するように作ったのですが
入力した値が帰ってきません・・・
http://www9.plala.or.jp/sgwr-t/c/sec15-5.html
などを見て見ましたが原因がいまいちよくわかりません。
どなたか教えてください
おねがいします<_ _>
#include<stdio.h>
#include<malloc.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];
head=NULL;
while(1){
p=talloc();
if(scanf("%s",buffer) == EOF){
break;
strcpy(p->name, buffer);
}
if(buffer == "^Z")break;
printf(" ");
if(gets(buffer) == EOF){
if(scanf("%s",buffer) == EOF){
break;
strcpy(p->tel, buffer);
}
p->pointer=head;/*今までの先頭ポインタを次のポインタに*/
head=p;
}
p=head;
while(p!=NULL){
printf("%6s %s\n",p->name,p->tel);
p=p->pointer;
}
return 0;
}
struct tfield *talloc(void)/*記憶領域の取得*/
{
return (struct tfield *)malloc(sizeof(struct tfield));
}
変数は変えるなとのことです。
あと、
「name tel
name tel
name tel
^z
name tel
name tel
name tel」
と表示したいのですがCtrl+zを二回押さないとできません><、
当方プログラム1ヶ月の初心者です
ご指導どうかよろしくお願いします<_ _>
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));
}
この回答への補足
質問者です<_ _>
回答ありがとうございました
Ctrl+zでの終了条件三時間以上悩みましたが解決できませんでした;;
別途質問することにします。
自己参照構造体とリストの解説ためになりました!
ありがとうございました<_ _>
コメント付で、凄い解りやすいです!
大変感謝です!ありがとうございます<_ _>
サイトや参考書見てもソースと解説が別々なのが多く解りにくいので
理解にするのに大変役に立ちました。
ただ、問題にはCtrl+zで終了と変数増やすなとあるので
そのとおり作らないと駄目らしいです(何故w)^^;
なんとかCtrl+zでやってみます。(fgetsでもEOF判定可能なのでしょうか・・・)
ただ、EOFのルールみたいなものが完璧に理解していないので
お時間ありましたらご指導お願いします<_ _>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
char型2つを結合し、short型に...
-
【C言語】全角文字の配列を、全...
-
C言語のプログラムで、途中で止...
-
#defineが使用するメモリ領域に...
-
fatal error LNK1120: 外部参照...
-
受信データから必要な部分のみ...
-
HANDLEのエラー
-
空白を含んだ文字列がうまく格...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
数字以外が入力されたらエラー...
-
#if 1 #elseの意味について
-
エクセルで可視セルにのみ値貼...
-
C言語での引数の省略方法
-
DWORDの実際の型は何でしょうか
-
複数桁10進数の*桁目だけを抽出...
-
fgetsなどのときのstdinのバッ...
-
#define _CRT_SECURE_NO_WARNIN...
-
構文エラー";"が型の前にあり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
エラーについて質問です。
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
プログラミングの授業の課題です
-
csvファイルの読み取り
-
Cプログラムについて
-
strtok
-
矢印キーを押下してコンソール...
-
C言語で複数列のデータを1列の...
-
ポインタと配列
-
構造体メンバの初期化
-
言語Cについて教えていただけま...
-
C++で指定文字列のカウント方法...
-
小数の指数表示
-
VC++でSQLへSELECT文を送ったの...
-
reallocでエラー
-
ファイル
おすすめ情報