リストに名前、身長のデータを入力して、ENDで始まる文字列を入力したら終了するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
po_po
記事: 38
登録日時: 10年前

リストに名前、身長のデータを入力して、ENDで始まる文字列を入力したら終了するプログラム

#1

投稿記事 by po_po » 9年前

キーボードから名前,年を入力して,それまでに入力した氏名と年齢を年齢の小さい順に表示し,次の入力を促す.ENDで始まる文字を入力すると終了する.
というプログラムを作りたいのですが、並べ替えて表示するのはできたのですが、ENDを入力しても終了させることができません。
何が間違っているのか教えてください。

コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct list{
  char name[20];
  int age;
  struct list *next;
};

int main(void){
  struct list *head;
  struct list *dummy, *new, *prev, *current,*i;
  
  dummy = (struct list *)malloc(sizeof(struct list));
  strcpy(dummy->name, "");
  dummy->age=0;
  dummy->next=NULL;
  head=dummy;
  
  char end[3] = "END";
  int ret;

  while((new = (struct list *)malloc(sizeof(struct list)) )){
   printf("氏名と年齢をスペースで区切って入力してください\n");
   if( scanf("%s%d", new->name, &new->age)==EOF ) break;
   ret = strncmp(new->name, end , 3);
   if(ret == 0) break;
   current = head;
   prev = head;

  while( current!=NULL){
    prev = current;
    current = current->next;
  }
  new->next = current;
  prev->next = new;
  
  int tmp;
  char str[20];
  
  i = head;
  
  while(i->next != NULL){
   if((head->next)->age > new->age){
  	 new->next = head->next;
  	 prev->next = current;
  	 head->next = new;
  	}
   else if((i->age < new->age) && (new->age <= (i->next)->age)){
 	prev->next = current;
  	new->next = i->next;
  	i->next = new;
  }
  
  i = i->next;
  
  }

  new = head;
  new = new->next;
  
  printf("現在のリスト\n");
   while(new != NULL){
  	printf("%s %d\n",new->name, new->age);
  	
  	new = new->next;
  	}
  } 	
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: リストに名前、身長のデータを入力して、ENDで始まる文字列を入力したら終了するプログラム

#2

投稿記事 by みけCAT » 9年前

文字列の次の数字が入力されるのを待っているのを、終了させることができないと勘違いしている可能性があります。

コード:

   if( scanf("%s%d", new->name, &new->age)==EOF ) break;
   ret = strncmp(new->name, end , 3);
   if(ret == 0) break;

コード:

   if( scanf("%s", new->name)==EOF ) break;
   ret = strncmp(new->name, end , 3);
   if(ret == 0) break;
   if( scanf("%d", &new->age)==EOF ) break;
としてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

po_po
記事: 38
登録日時: 10年前

Re: リストに名前、身長のデータを入力して、ENDで始まる文字列を入力したら終了するプログラム

#3

投稿記事 by po_po » 9年前

まさにその通り勘違いしていました。
ありがとうございます

閉鎖

“C言語何でも質問掲示板” へ戻る