• ベストアンサー

(構造体)ループ条件のscanf文が処理されない!?

ループのscanf文を入力していないのに勝手にループの中に入って処理をしています。なぜでしょうか? #include<stdio.h> #include<malloc.h> #include<process.h> typedef struct node{ struct node *left; char name[20]; int age; struct node *right; }NODE; NODE *memalloc(void); void main(void) { NODE *head, *p, *old; /*ダミーノード作成*/ p = memalloc(); head = p; p -> left = p; p -> right = p; old = head; p = memalloc(); printf("名前 年齢入力 >"); scanf("%s, %d", p -> name, &p -> age); old -> left = p; old -> right = p; p -> left = old; p -> right = old; while(p = memalloc(), old = p, printf("名前 年齢入力 >"), scanf("%s, %d", p -> name, &p -> age) != EOF){ printf("確認\n"); old -> right = p; p -> left = old; head -> left = p; p -> right = head; } p = head -> right; while(head -> left != p -> right){ printf("名前:%20s 年齢:%5d\n", p -> name, p -> age); p = p -> right; } } NODE *memalloc(void) { NODE *ptr; if((ptr = (NODE *)malloc(sizeof(NODE))) != NULL){ return ptr; } printf("\n動的メモリ割当に失敗しました。\n"); exit(1); return(0); }

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

  • ベストアンサー
回答No.3

No.2です。やってみたらだめでしたね。すいません。scanfの中を"%s %d"にしましょう。。 ついでに、添付のソースが動かなかったので手直ししてみました。。。(本当は最後に確保したメモリの開放をした方がいいのだけど) #include<stdio.h> #include<malloc.h> #include<process.h> typedef struct node{ struct node *left; char name[20]; int age; struct node *right; }NODE; NODE *memalloc(void); void main(void) { NODE *head, *p, *old; /*ダミーノード作成*/ p = memalloc(); head = p; p -> left = p; p -> right = p; old = head; /* 入力&ノード追加(右に伸ばして最後をダミーにつなげる) */ while(p = memalloc(), printf("名前 年齢入力 >"), scanf("%s %d", p -> name, &p -> age) != EOF){ printf("確認: 名前 %s 年齢 %d\n",p->name,p->age); old -> right = p; p -> left = old; head -> left = p; p -> right = head; old=p; } /* 右回りに表示 */ p = head -> right; while(p != head){ printf("名前:%20s 年齢:%5d\n", p -> name, p -> age); p = p -> right; } } /* ノード用メモリ確保 */ NODE *memalloc(void) { NODE *ptr; if((ptr = (NODE *)malloc(sizeof(NODE))) != NULL){ return ptr; } printf("\n動的メモリ割当に失敗しました。\n"); exit(1); return(0); }

yukikundesuyo
質問者

お礼

ソースまで手直ししていただいてありがとうございます。scanfの%dと%sのカンマを入力していなかったのが原因だと分かり大変参考になりました。

その他の回答 (2)

回答No.2

たぶんデータの入力がscanfの期待したフォーマットになっていないのだと思います。 例えば、YUKIKUN,20 みたいに、名前,数字ならうまくいくのでは?(名前にスペースを入れてはいけません)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

たぶん、その前のscanfでの文字(改行とか)が入力バッファに残っていてそれを入力とみなして 次のscanfが動いてしまうのでしょう。 gets等を利用して一行入力し それからsscanfされることをオススメします。

関連するQ&A