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

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

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

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

Q&A

解決済

4回答

2038閲覧

C言語 coredump 解決法

junnnnchan

総合スコア26

C

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

0グッド

0クリップ

投稿2020/06/05 13:19

編集2020/06/10 08:45

<修正後>

#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 10 /*--- int 型スタックを実現する構造体 ---*/ typedef struct{ double vision; /* 視力 */ int height; /* 身長 */ } Body ; /*--- 身体検査データ型 ---*/ typedef struct{ Body body; /* 身体データ型 ---*/ char *name; /* 氏名 */ } PhysCheck ; typedef struct { int max; /* スタックの容量 */ int ptr; /* スタックポインタ */ PhysCheck stk[MAX]; /* スタック本体*/ } PhysCheckStack; int Search(PhysCheckStack *s , PhysCheck *x){ int count = 0; for(int i = 0 ; i < s->ptr ; i ++){ if(strcmp(x->name,s->stk[i].name) == 0){//string compare 文字一致したら0返す printf("%s %f %d\n",s->stk[i].name,s->stk[i].body.vision,s->stk[i].body.height); count ++; } } return count; } /*--- スタックの初期化 ---*/ int Initialize(PhysCheckStack *s, int max){ s->ptr = 0; if ((s->stk[s->ptr].name = calloc(max, sizeof(char*))) == NULL) { s->max = 0; /* char* の配列の確保に失敗 */ return -1; } s->max = max; return 0; } /*--- スタックにデータをプッシュ ---*/ int Push(PhysCheckStack *s, PhysCheck *x){ if (s->ptr >= s->max) return -1; /* スタック満杯 */ strcpy(s->stk[s->ptr].name,x->name); if ((s->stk[s->ptr].name = calloc(strlen(x->name)+1, sizeof(char*))) == NULL) /* データをコピーするための動的な文字列保存用配列を確保することに失敗 */ return -1; s->stk[s->ptr].body.vision = x->body.vision; s->stk[s->ptr].body.height = x->body.height; s->ptr++; return 0; } /*--- スタックからデータをポップ ---*/ int Pop(PhysCheckStack *s, PhysCheck *x){ if (s->ptr <= 0) return -1; /* スタックは空 */ s->ptr--; strcpy(x->name,s->stk[s->ptr].name); x->body.vision = s->stk[s->ptr].body.vision; x->body.height = s->stk[s->ptr].body.height; free(s->stk[s->ptr].name); return (0); } /*--- スタックからデータをピーク ---*/ int Peek(PhysCheckStack *s, PhysCheck *x){ if (s->ptr <= 0) return -1; strcpy(x->name,s->stk[s->ptr-1].name); x->body.vision = s->stk[s->ptr-1].body.vision; x->body.height = s->stk[s->ptr-1].body.height; return 0; } /*--- スタックの容量 ---*/ int Capacity(const PhysCheckStack *s){ return s->max; } /*--- スタックに積まれているデータ数 ---*/ int Size(const PhysCheckStack *s){ return s->ptr; } /*--- スタックの全データの表示 ---*/ void Print(const PhysCheckStack *s){ int i; for(i = 0; i < s->ptr; i++) printf("%s %f %d", s->stk[i].name,s->stk[i].body.vision,s->stk[i].body.height); putchar('\n'); } int main(void){ PhysCheckStack s; PhysCheck x; Initialize(&s, MAX); while (1) { int menu; printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s)); printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (5) 探索 (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /* プッシュ */ printf("データ:"); scanf("%d", &x.body.height); scanf("%s",x.name); scanf("%lf",&x.body.vision); if (Push(&s, &x) == -1) puts("\a エラー:プッシュに失敗しました。"); break; case 2: /* ポップ */ if (Pop(&s, &x) == -1) puts("\a エラー:ポップに失敗しました。"); else printf("ポップしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height); break; case 3: /* ピーク */ if (Peek(&s, &x) == -1) puts("\a エラー:ピークに失敗しました。"); else printf("ピークしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height); break; case 4: /* 表示 */ Print(&s);https://www.onlinegdb.com/fork/HyZW3BAi8#tab-stdin break; case 5://探索 scanf("%s",x.name); int search = Search(&s,&x); if(search == 0){ puts("パターンは存在しません"); } else{ printf("%dパターンあります\n",search); } } } return 0; }

<したいこと>
最初のメニューで1を選択し、push関数に111、aaa、111と入力して、スタックにプッシュします。
メニューで5を選択して、aと入力するとs->ptrが指してる0を返すプログラムを作りたいです。
<現在>
二回プッシュするとSegmentation fault (core dumped) と表示されます。

<質問>
プッシュ、サーチが出来るように実装したいです
char *nameは変えずにコード作成したいです。

<追記>

#include <stdio.h> #include <string.h> #include <stdlib.h> /*--- int 型スタックを実現する構造体 ---*/ typedef struct{ double vision; /* 視力 */ int height; /* 身長 */ } Body ; /*--- 身体検査データ型 ---*/ typedef struct{ Body body; /* 身体データ型 ---*/ char *name; /* 氏名 */ } PhysCheck ; typedef struct { int max; /* スタックの容量 */ int ptr; /* スタックポインタ */ PhysCheck **stk; /* スタック本体*/ } PhysCheckStack; int Search(PhysCheckStack *s , PhysCheck *x){ for(int i = s->ptr-1 ; i >= 0 ; i --){ if(strncmp(s->stk[i]->name, x->name ,strlen(x->name)) == 0){//strncmp先頭n文字を比較 return i; } } return -1; } /*--- スタックの初期化 ---*/ int Initialize(PhysCheckStack *s, int max){ s->ptr = 0; if ((s->stk = calloc(max, sizeof(PhysCheck *))) == NULL) { s->max = 0; /* char* の配列の確保に失敗 */ return -1; } s->max = max; return 0; } /*--- スタックにデータをプッシュ ---*/ int Push(PhysCheckStack *s, PhysCheck *x){ if (s->ptr >= s->max) return -1; /* スタック満杯 */ if ((s->stk[s->ptr] = calloc(strlen(x->name)+1, sizeof(PhysCheck *))) == NULL) /* データをコピーするための動的な文字列保存用配列を確保することに失敗 */ return -1; s->stk[s->ptr]->name = calloc(strlen(x->name)+1, sizeof(char)); strcpy(s->stk[s->ptr]->name,x->name); s->stk[s->ptr]->body.vision = x->body.vision; s->stk[s->ptr]->body.height = x->body.height; s->ptr++; return 0; } /*--- スタックからデータをポップ ---*/ int Pop(PhysCheckStack *s, PhysCheck *x){ if (s->ptr <= 0) return -1; /* スタックは空 */ s->ptr--; strcpy(x->name,s->stk[s->ptr]->name); x->body.vision = s->stk[s->ptr]->body.vision; x->body.height = s->stk[s->ptr]->body.height; free(s->stk[s->ptr]->name); return (0); } /*--- スタックからデータをピーク ---*/ int Peek(PhysCheckStack *s, PhysCheck *x){ if (s->ptr <= 0) return -1; strcpy(x->name,s->stk[s->ptr-1]->name); x->body.vision = s->stk[s->ptr-1]->body.vision; x->body.height = s->stk[s->ptr-1]->body.height; return 0; } /*--- スタックの容量 ---*/ int Capacity(const PhysCheckStack *s){ return s->max; } /*--- スタックに積まれているデータ数 ---*/ int Size(const PhysCheckStack *s){ return s->ptr; } /*--- スタックの全データの表示 ---*/ void Print(const PhysCheckStack *s){ int i; for(i = 0; i < s->ptr; i++) printf("%s %f %d\n", s->stk[i]->name,s->stk[i]->body.vision,s->stk[i]->body.height); putchar('\n'); } void Terminate(PhysCheckStack *s){ if(s->stk != NULL) free(s->stk); s->max = s->ptr = 0; } int main(void){ PhysCheckStack s; PhysCheck x; int max; char y[100]; printf("スタックの大きさを入力してください"); scanf("%d", &max); if (Initialize(&s, max)==-1){ puts("スタックの生成に失敗しました.\n"); } while (1) { int menu; printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s)); printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (5) 探索 (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /* プッシュ */ printf("データ:"); scanf("%d", &x.body.height); scanf("%s",y); x.name = (char *)malloc(sizeof(char)*(strlen(y) + 1)); strcpy(x.name,y); scanf("%lf",&x.body.vision); if (Push(&s, &x) == -1) puts("\a エラー:プッシュに失敗しました。"); break; case 2: /* ポップ */ if (Pop(&s, &x) == -1) puts("\a エラー:ポップに失敗しました。"); else printf("ポップしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height); break; case 3: /* ピーク */ if (Peek(&s, &x) == -1) puts("\a エラー:ピークに失敗しました。"); else printf("ピークしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height); break; case 4: /* 表示 */ Print(&s); break; case 5://探索 scanf("%s",x.name); int search = Search(&s,&x); if(search == -1){ puts("パターンは存在しません"); } else{ printf("名前に含まれるパターンは%d個です\n",search); } } } return 0; }

自分なりにやってみました。おそらくもっと効率の良いプログラムがあると思っていますが、今の自分でできることはしました。
ポインタについて勉強しなおします。。。

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

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

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

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

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

episteme

2020/06/05 13:30

教本ひととおり読んではいかがか?
guest

回答4

0

C

1typedef struct{ 2 Body body; /* 身体データ型 ---*/ 3 char *name[20]; /* 氏名 */ 4} PhysCheck ;

氏名(文字列)を20個持ってるんですか?
それはあなたの意図したものですか?

投稿2020/06/05 13:26

episteme

総合スコア16612

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

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

junnnnchan

2020/06/05 14:23

すいませんミスです。 いま更新します。
episteme

2020/06/05 15:08

> scanf("%s",x.name); 確保されていない領域に読みこもうとしたら、 そりゃSegmentation fault起こすでしょうよ。 誤りはここだけじゃなく、いたるところにあります。 いちいち指摘してられません。 「やりなおし」
guest

0

自己解決

ぽいんたのがくしゅうぶそく
再学習

投稿2020/06/10 08:31

junnnnchan

総合スコア26

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

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

0

...こんなもんかしら

C

1#define _CRT_SECURE_NO_WARNINGS 2#include <stdio.h> 3#include <string.h> 4#include <stdlib.h> 5#include <stdbool.h> 6 7typedef struct { 8 double vision; /* 視力 */ 9 int height; /* 身長 */ 10} Body; 11 12/*--- 身体検査データ型 ---*/ 13typedef struct { 14 Body body; /* 身体データ型 ---*/ 15 char name[20]; /* 氏名 */ 16} PhysCheck; 17 18void PhysCheckCopy(PhysCheck* dst, const PhysCheck* src) { 19 dst->body.height = src->body.height; 20 dst->body.vision = src->body.vision; 21 strcpy(dst->name, src->name); 22} 23 24PhysCheck* PhysCheckDup(const PhysCheck* x) { 25 PhysCheck* p = (PhysCheck*)malloc(sizeof(PhysCheck)); 26 if ( p != NULL ) { 27 PhysCheckCopy(p,x); 28 } 29 return p; 30} 31 32bool PhysCheckEqual(const PhysCheck* a, const PhysCheck* b) { 33 return strcmp(a->name, b->name) == 0; 34} 35 36void PhysCheckPrint(const PhysCheck* x) { 37 printf("%s %f %d\n", x->name, x->body.vision, x->body.height); 38} 39 40typedef struct { 41 int max; /* スタックの容量 */ 42 int ptr; /* スタックポインタ */ 43 PhysCheck** stk; /* スタック本体*/ 44} PhysCheckStack; 45 46int Search(const PhysCheckStack* s, const PhysCheck* x) { 47 int count = 0; 48 for (int i = 0; i < s->ptr; i++) { 49 if ( PhysCheckEqual(s->stk[i], x) ) { 50 PhysCheckPrint(s->stk[i]); 51 count++; 52 } 53 } 54 return count; 55} 56 57/*--- スタックの初期化 ---*/ 58bool Initialize(PhysCheckStack* s, int max) { 59 s->stk = (PhysCheck**)calloc(max, sizeof(PhysCheck*)); 60 if ( s->stk == NULL ) { 61 return false; 62 } 63 s->ptr = 0; 64 s->max = max; 65 return true; 66} 67 68/*--- スタックにデータをプッシュ ---*/ 69bool Push(PhysCheckStack* s, const PhysCheck* x) { 70 if (s->ptr >= s->max) return false; /* スタック満杯 */ 71 PhysCheck* y = PhysCheckDup(x); 72 if ( y == NULL ) return false; 73 s->stk[s->ptr] = y; 74 s->ptr++; 75 return true; 76} 77 78/*--- スタックからデータをポップ ---*/ 79bool Pop(PhysCheckStack* s, PhysCheck* x) { 80 if (s->ptr <= 0) return false; /* スタックは空 */ 81 s->ptr--; 82 PhysCheckCopy(x, s->stk[s->ptr]); 83 free(s->stk[s->ptr]); 84 return true; 85} 86 87/*--- スタックからデータをピーク ---*/ 88bool Peek(PhysCheckStack* s, PhysCheck* x) { 89 if (s->ptr <= 0) return false; 90 PhysCheckCopy(x, s->stk[s->ptr - 1]); 91 return true; 92} 93 94/*--- スタックの容量 ---*/ 95int Capacity(const PhysCheckStack* s) { 96 return s->max; 97} 98 99/*--- スタックに積まれているデータ数 ---*/ 100int Size(const PhysCheckStack* s) { 101 return s->ptr; 102} 103 104/*--- スタックの全データの表示 ---*/ 105void Print(const PhysCheckStack* s) { 106 int i; 107 108 for (i = 0; i < s->ptr; i++) 109 PhysCheckPrint(s->stk[i]); 110 putchar('\n'); 111} 112 113/*--- スタックの廃棄 ---*/ 114void Terminate(PhysCheckStack* s) { 115 PhysCheck x; 116 while ( Size(s) > 0 ) { 117 Pop(s,&x); 118 } 119 free(s->stk); 120} 121 122int main(void) { 123 PhysCheckStack s; 124 PhysCheck x; 125 Initialize(&s, 10); 126 while (1) { 127 int menu; 128 printf("現在のデータ数:%d/%d\n", Size(&s), Capacity(&s)); 129 printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (5) 探索 (0) 終了:"); 130 scanf("%d", &menu); 131 if (menu == 0) break; 132 switch (menu) { 133 case 1: /* プッシュ */ 134 printf("データ(name vision height):"); 135 scanf("%s", x.name); 136 scanf("%lf", &x.body.vision); 137 scanf("%d", &x.body.height); 138 if ( !Push(&s, &x) ) 139 puts("\a エラー:プッシュに失敗しました。"); 140 break; 141 case 2: /* ポップ */ 142 if ( !Pop(&s, &x) ) { 143 puts("\a エラー:ポップに失敗しました。"); 144 } else { 145 printf("ポップしたデータは"); 146 PhysCheckPrint(&x); 147 } 148 break; 149 case 3: /* ピーク */ 150 if ( !Peek(&s, &x) ) { 151 puts("\a エラー:ピークに失敗しました。"); 152 } else { 153 printf("ピークしたデータは"); 154 PhysCheckPrint(&x); 155 } 156 break; 157 case 4: /* 表示 */ 158 Print(&s); 159 break; 160 case 5://探索 161 scanf("%s", x.name); 162 int search = Search(&s, &x); 163 if ( search == 0 ) { 164 puts("パターンは存在しません"); 165 } else { 166 printf("%dパターンあります\n", search); 167 } 168 } 169 } 170 Terminate(&s); 171 return 0; 172}

[追記] char* name 版

C

1#define _CRT_SECURE_NO_WARNINGS 2#include <stdio.h> 3#include <string.h> 4#include <stdlib.h> 5#include <stdbool.h> 6 7typedef struct { 8 double vision; /* 視力 */ 9 int height; /* 身長 */ 10} Body; 11 12/*--- 身体検査データ型 ---*/ 13typedef struct { 14 Body body; /* 身体データ型 ---*/ 15 char* name; /* 氏名 */ 16} PhysCheck; 17 18PhysCheck* PhysCheckCreate(const char* name, double vision, int height) { 19 PhysCheck* p = (PhysCheck*)malloc(sizeof(PhysCheck)); 20 if (p != NULL) { 21 p->name = (char*)malloc(strlen(name) + 1); 22 if (p->name == NULL) { 23 free(p); 24 p = NULL; 25 } 26 else { 27 strcpy(p->name, name); 28 p->body.height = height; 29 p->body.vision = vision; 30 } 31 } 32 return p; 33} 34 35void PhysCheckDestroy(PhysCheck* x) { 36 free(x->name); 37 free(x); 38} 39 40bool PhysCheckEqual(const PhysCheck* a, const PhysCheck* b) { 41 return strcmp(a->name, b->name) == 0; 42} 43 44void PhysCheckPrint(const PhysCheck* x) { 45 printf("%s %f %d\n", x->name, x->body.vision, x->body.height); 46} 47 48typedef struct { 49 int max; /* スタックの容量 */ 50 int ptr; /* スタックポインタ */ 51 PhysCheck** stk; /* スタック本体*/ 52} PhysCheckStack; 53 54int Search(const PhysCheckStack* s, const PhysCheck* x) { 55 int count = 0; 56 for (int i = 0; i < s->ptr; i++) { 57 if (PhysCheckEqual(s->stk[i], x)) { 58 PhysCheckPrint(s->stk[i]); 59 count++; 60 } 61 } 62 return count; 63} 64 65int SearchByName(const PhysCheckStack* s, const char* name) { 66 int count = 0; 67 for (int i = 0; i < s->ptr; i++) { 68 if (strcmp(s->stk[i]->name, name)) { 69 PhysCheckPrint(s->stk[i]); 70 count++; 71 } 72 } 73 return count; 74} 75 76/*--- スタックの初期化 ---*/ 77bool Initialize(PhysCheckStack* s, int max) { 78 s->stk = (PhysCheck**)calloc(max, sizeof(PhysCheck*)); 79 if (s->stk == NULL) { 80 return false; 81 } 82 s->ptr = 0; 83 s->max = max; 84 return true; 85} 86 87/*--- スタックにデータをプッシュ ---*/ 88bool Push(PhysCheckStack* s, PhysCheck* x) { 89 if (s->ptr >= s->max) return false; /* スタック満杯 */ 90 s->stk[s->ptr] = x; 91 s->ptr++; 92 return true; 93} 94 95/*--- スタックからデータをポップ ---*/ 96PhysCheck* Pop(PhysCheckStack* s) { 97 if (s->ptr <= 0) return NULL; /* スタックは空 */ 98 s->ptr--; 99 return s->stk[s->ptr]; 100} 101 102/*--- スタックからデータをピーク ---*/ 103PhysCheck* Peek(PhysCheckStack* s) { 104 if (s->ptr <= 0) return NULL; 105 return s->stk[s->ptr - 1]; 106} 107 108/*--- スタックの容量 ---*/ 109int Capacity(const PhysCheckStack* s) { 110 return s->max; 111} 112 113/*--- スタックに積まれているデータ数 ---*/ 114int Size(const PhysCheckStack* s) { 115 return s->ptr; 116} 117 118/*--- スタックの全データの表示 ---*/ 119void Print(const PhysCheckStack* s) { 120 int i; 121 122 for (i = 0; i < s->ptr; i++) 123 PhysCheckPrint(s->stk[i]); 124 putchar('\n'); 125} 126 127/*--- スタックの廃棄 ---*/ 128void Terminate(PhysCheckStack* s) { 129 while (Size(s) > 0) { 130 PhysCheckDestroy(Pop(s)); 131 } 132 free(s->stk); 133} 134 135int main(void) { 136 PhysCheckStack s; 137 Initialize(&s, 10); 138 while (1) { 139 int menu; 140 double vision; 141 int height; 142 char name[50]; 143 PhysCheck* x; 144 printf("現在のデータ数:%d/%d\n", Size(&s), Capacity(&s)); 145 printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (5) 探索 (0) 終了:"); 146 scanf("%d", &menu); 147 if (menu == 0) break; 148 switch (menu) { 149 case 1: /* プッシュ */ 150 printf("データ(name vision height):"); 151 scanf("%s", name); 152 scanf("%lf", &vision); 153 scanf("%d", &height); 154 x = PhysCheckCreate(name, vision, height); 155 if (x == NULL || !Push(&s, x)) 156 puts("\a エラー:プッシュに失敗しました。"); 157 break; 158 case 2: /* ポップ */ 159 x = Pop(&s); 160 if (x == NULL) { 161 puts("\a エラー:ポップに失敗しました。"); 162 } 163 else { 164 printf("ポップしたデータは"); 165 PhysCheckPrint(x); 166 PhysCheckDestroy(x); 167 } 168 break; 169 case 3: /* ピーク */ 170 x = Peek(&s); 171 if (x == NULL) { 172 puts("\a エラー:ピークに失敗しました。"); 173 } 174 else { 175 printf("ピークしたデータは"); 176 PhysCheckPrint(x); 177 } 178 break; 179 case 4: /* 表示 */ 180 Print(&s); 181 break; 182 case 5://探索 183 printf("検索する名前:"); 184 scanf("%s", name); 185 int search = SearchByName(&s, name); 186 if (search == 0) { 187 puts("パターンは存在しません"); 188 } 189 else { 190 printf("%dパターンあります\n", search); 191 } 192 } 193 } 194 Terminate(&s); 195 return 0; 196}

投稿2020/06/05 22:17

編集2020/06/10 08:39
episteme

総合スコア16612

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

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

junnnnchan

2020/06/06 01:55

すいません。自分の説明不足でした。 char name[20]ではなく、char *nameでコード作成に挑戦してました。 ほんとにすいません。
episteme

2020/06/06 02:05

いやべつに謝るよなことじゃなくて、char*でやればいいんじゃね?
episteme

2020/06/06 12:40

やってみたけどちぃと面倒になりますな...
junnnnchan

2020/06/06 13:33

ポインタについての理解が不足していたと反省したので一から教本読み直しています。。。
guest

0

どこかでメモリ破壊してるとかアクセス違反してるとかなので、そういう怪しいところを探すべし

あなたにはまだポインタをどーこ~するのは早いので、まずはC言語の文法をしっかり学びましょう。
身の丈を超えて、質問回答繰り返しても理解できないでしょ。

投稿2020/06/05 13:22

編集2020/06/05 13:25
y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問