質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1926閲覧

オーバーフローします...

RYUi

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/05/21 14:41

###前提・実現したいこと
アルファベット順に表示したいです
どうやったらアルファベット順に表示できますか?
もし,このままでいいならオーバーフローを直して欲しいです...
アルファベット順に表示させる機能を実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

エラーメッセージ Abort trap: 6

###該当のソースコード

c言語 ここにご自身が実行したソースコードを書いてください #include<stdio.h> #include<string.h> #include<stdlib.h> struct data{ char name[256]; char mail[256]; int group; int ID; struct data *next; }; void alphabet_output(struct data *p1); struct data* new_data(struct data* list); void list_output(struct data* p); int main(void){ struct data *list = NULL; int i=1; while(i){ list = new_data(list); scanf("%d",&i); } alphabet_output(list); //list_output(list); } void alphabet_output(struct data *p1){ //アルファベット順に表示// struct data *p2; //交換するために使う// struct data *p3; //それぞれの比較でアルファベット順で一番早い人を格納しておく struct data *p4; //一番初めを格納 struct data *p5; //比較する対象 p2=(struct data*)malloc(sizeof(struct data)); p3=(struct data*)malloc(sizeof(struct data)); p5=(struct data*)malloc(sizeof(struct data)); if(p1->next==NULL){ printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID); } else{ p4=p1; while(p1->next!=NULL){ p3=p1; p5=p1; while(1){ if(p5->next==NULL){ break; } if(strcmp(p3->name,p5->name)==0){ } else if(strcmp(p3->name,p5->name)>0){ p3=p5; } else if(strcmp(p3->name,p5->name)<0){ } p5 = p5->next; } strcpy(p2->name,p1->name); strcpy(p2->mail,p1->mail); p2->group=p1->group; p2->ID=p1->ID; strcpy(p1->name,p3->name); strcpy(p1->mail,p3->mail); p1->group=p3->group; p1->ID=p3->ID; strcpy(p3->name,p2->name); strcpy(p3->mail,p2->mail); p3->group=p2->group; p3->ID=p2->ID; p5=p1->next; p1=p1->next; } p1=p4; while(p1->next!=NULL){ printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID); p1=p1->next; } printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID); } } struct data* new_data(struct data* list){ char check[256]; int a,b=0; struct data* node = (struct data*)malloc(sizeof(struct data)); printf("データを入力してください。\n"); printf("name:"); scanf("%s",node->name); printf("mail:"); scanf("%s",node->mail); while(b!=1){ printf("group:"); scanf("%s",check); a=0; b=1; while(check[a]!='\0'&& check[a] != '\n'){ if(check[a]<'0' || '9'<check[a]){ b=0; printf("数字を入力してください。\n");break; } a++; } node->group = atoi(check); } node->next = NULL; if(list == NULL){ node->ID = 1; return node;//空なら、ここに入る } else{ struct data* p = list; int n = 2; p->ID = 1; while (p->next != NULL) {//最後までいく p->next->ID = n; n++; p = p->next; } node->ID = n; p->next = node; //最後のとこにれんけつする \ return list; } } void list_output(struct data *p){ int total=0; while(p!=NULL){ printf("%s %s %d %d\n",p->name,p->mail,p->group,p->ID); total++; if(p->next == NULL) break; p=p->next; } printf("登録者数は%dです\n",total); }

###試したこと
ネットで確認するとオーバーフローとはわかったのですがその後どうソースコードを直せばいいのかわからなかったです.

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

この課題は、リスト構造のデータのソートで、ポインタの付け替えでできるってことを学ぶものだと思います。今の不具合がとれデータをコピーする方法で解決してたとしても、評価は低いと思われます。

それを踏まえてもう一度、考えてみてはどうでしょうか

投稿2017/05/22 03:28

tmp

総合スコア274

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

少し修正しましたが、オーバーフローを起こせませんでした?

c

1#include<stdio.h> 2#include<string.h> 3#include<stdlib.h> 4 5struct data{ 6 char name[256]; 7 char mail[256]; 8 int group; 9 int ID; 10 struct data *next; 11}; 12 13void alphabet_output(struct data *p1); 14struct data* new_data(struct data* list); 15void list_output(struct data* p); 16 17int main(void){ 18 19 20 struct data *list = NULL; 21 int i=1; 22 23 while(i){ 24 list = new_data(list); 25 scanf("%d",&i); 26 } 27 28 alphabet_output(list); 29 list_output(list); 30 return 0; 31} 32 33void alphabet_output(struct data *p1){ //アルファベット順に表示// 34 35 struct data *p2; //交換するために使う// 36 struct data *p3; //それぞれの比較でアルファベット順で一番早い人を格納しておく 37 struct data *p4; //一番初めを格納 38 struct data *p5; //比較する対象 39 40 p2=(struct data*)malloc(sizeof(struct data)); 41 p3=(struct data*)malloc(sizeof(struct data)); 42 p5=(struct data*)malloc(sizeof(struct data)); 43 if(p1->next==NULL){ 44 printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID); 45 } 46 else{ 47 p4=p1; 48 while(p1->next!=NULL){ 49 50 p3=p1; 51 p5=p1; 52 53 while(1){ 54 55 if(strcmp(p3->name,p5->name)==0){ 56 } 57 else if(strcmp(p3->name,p5->name)>0){ 58 p3=p5; 59 } 60 else if(strcmp(p3->name,p5->name)<0){ 61 } 62 63 if(p5->next==NULL){ 64 break; 65 } 66 p5 = p5->next; 67 } 68 69 strcpy(p2->name,p1->name); 70 strcpy(p2->mail,p1->mail); 71 p2->group=p1->group; 72 p2->ID=p1->ID; 73 74 strcpy(p1->name,p3->name); 75 strcpy(p1->mail,p3->mail); 76 p1->group=p3->group; 77 p1->ID=p3->ID; 78 79 strcpy(p3->name,p2->name); 80 strcpy(p3->mail,p2->mail); 81 p3->group=p2->group; 82 p3->ID=p2->ID; 83 //p5=p1->next; 84 85 p1=p1->next; 86 } 87 88 p1=p4; 89 while(p1->next!=NULL){ 90 printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID); 91 p1=p1->next; 92 } 93 printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID); 94 } 95} 96 97struct data* new_data(struct data* list){ 98 char check[256]; 99 int a,b=0; 100 101 struct data* node = (struct data*)malloc(sizeof(struct data)); 102 printf("データを入力してください。\n"); 103 printf("name:"); 104 scanf("%s",node->name); 105 printf("mail:"); 106 scanf("%s",node->mail); 107 108 while(b!=1){ 109 printf("group:"); 110 scanf("%s",check); 111 a=0; 112 b=1; 113 while(check[a]!='\0'&& check[a] != '\n'){ 114 if(check[a]<'0' || '9'<check[a]){ 115 b=0; 116 printf("数字を入力してください。\n");break; 117 } 118 a++; 119 } 120 } 121 node->group = atoi(check); 122 node->next = NULL; 123 124 if(list == NULL){ 125 node->ID = 1; 126 return node;//空なら、ここに入る 127 } 128 else{ 129 struct data* p = list; 130 int n = 2; 131 p->ID = 1; 132 while (p->next != NULL) {//最後までいく 133 p->next->ID = n; 134 n++; 135 p = p->next; 136 } 137 node->ID = n; 138 p->next = node; 139 //最後のとこにれんけつする 140 return list; 141 } 142} 143 144void list_output(struct data *p){ 145 int total=0; 146 while(p!=NULL){ 147 148 printf("%s %s %d %d\n",p->name,p->mail,p->group,p->ID); 149 total++; 150 if(p->next == NULL) 151 break; 152 p=p->next; 153 154 } 155 printf("登録者数は%dです\n",total); 156} 157

ポインタの連結をソート版も作成してみました。

#include<stdio.h> #include<string.h> #include<stdlib.h> struct data{ char name[256]; char mail[256]; int group; int ID; struct data *next; }; struct data* new_data(struct data* list, int n); void list_output(struct data* p); int main(void){ struct data *list = NULL; int i=1; int n=1; while(i){ list = new_data(list, n++); scanf("%d",&i); } list_output(list); return 0; } struct data* new_data(struct data* list, int n){ char check[256]; int a,b=0; struct data* node = (struct data*)malloc(sizeof(struct data)); printf("データを入力してください。\n"); printf("name:"); scanf("%s",node->name); printf("mail:"); scanf("%s",node->mail); while(b!=1){ printf("group:"); scanf("%s",check); a=0; b=1; while(check[a]!='\0'&& check[a] != '\n'){ if(check[a]<'0' || '9'<check[a]){ b=0; printf("数字を入力してください。\n");break; } a++; } } node->group = atoi(check); node->ID = n; node->next = NULL; if(list == NULL){ list = node; } else{ struct data* p = list; struct data* r = list; while (1){ if(strcmp(p->name,node->name)>0){ node->next=p; if(r==list){ list=node; }else{ r->next=node; } break; } if (p->next==NULL){ p->next=node; break; } r = p; p = p->next; } } return list; } void list_output(struct data *p){ int total=0; while(p!=NULL){ printf("%s %s %d %d\n",p->name,p->mail,p->group,p->ID); total++; if(p->next == NULL) break; p=p->next; } printf("登録者数は%dです\n",total); }

投稿2017/05/22 01:53

編集2017/05/22 23:16
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RYUi

2017/05/22 05:06

オーバーフローしなくなりました!!ありがとうございました!!
guest

0

もし,このままでいいならオーバーフローを直して欲しいです...

メモリリークを起こすコードがある。
ソートもこれじゃできない。
エラー情報も少なすぎ。
もうちょっと自分で一度がんばりなさい。

何が正しいか自分で判断できる部分はあるはずです。
それを頭から見直していき、「おかしい」と思う部分がなくなるまでコードを整理してください。

で、解決できない「おかしい」が出たら質問しましょう。
正しいものと間違っているものが自分でわからないまま質問するのは今後のためによくありません。

投稿2017/05/22 01:16

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問