
こんにちは<_ _>
リストの問題についてなのですが出力と逆順に出力するプログラムで
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
ファイルから数字列を16進数の...
-
VC++でSQLへSELECT文を送ったの...
-
Cプログラムについて
-
setjmp・longjmpに関しまして
-
エラーについて質問です。
-
csvファイルの読み取り
-
c言語 sscanf の書式について...
-
ファイル操作で全角空白を消す
-
小数の指数表示
-
#defineが使用するメモリ領域に...
-
Ç言語でファイルサイズを変更す...
-
エクセルで可視セルにのみ値貼...
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語の型による処理速度の違い
-
*をユーザーが入力した数字の数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報