アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは<_ _>
リストの問題についてなのですが出力と逆順に出力するプログラムで
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ヶ月の初心者です
ご指導どうかよろしくお願いします<_ _>

A 回答 (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での終了条件三時間以上悩みましたが解決できませんでした;;

別途質問することにします。
自己参照構造体とリストの解説ためになりました!
ありがとうございました<_ _>

補足日時:2007/05/30 15:57
    • good
    • 0
この回答へのお礼

コメント付で、凄い解りやすいです!
大変感謝です!ありがとうございます<_ _>
サイトや参考書見てもソースと解説が別々なのが多く解りにくいので
理解にするのに大変役に立ちました。

ただ、問題にはCtrl+zで終了と変数増やすなとあるので
そのとおり作らないと駄目らしいです(何故w)^^;
なんとかCtrl+zでやってみます。(fgetsでもEOF判定可能なのでしょうか・・・)
ただ、EOFのルールみたいなものが完璧に理解していないので
お時間ありましたらご指導お願いします<_ _>

お礼日時:2007/05/30 14:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!