
こんにちは<_ _>
リストの問題についてなのですが出力と逆順に出力するプログラムで
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
csvファイルの読み取り
-
fread処理について
-
小数の指数表示
-
配列への文字列の格納について
-
【C言語】全角文字の配列を、全...
-
矢印キーを押下してコンソール...
-
Ç言語でファイルサイズを変更す...
-
空白を含んだ文字列がうまく格...
-
エラーについて質問です。
-
構造体メンバの初期化
-
困ってます!書き方がわかりま...
-
char型2つを結合し、short型に...
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
-
Aの値からBの値を除するとは??
-
「指定されたキャストは有効で...
-
DWORDの実際の型は何でしょうか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報