###前提・実現したいこと
出席番号と氏名を入力し名簿を作るプログラムですが、どこが間違っているのかわかりません。main文はmeibo20を読んでいるだけです。
###発生している問題・エラーメッセージ
キーボードで'I'を入力後、学籍番号が表示され、文字を入力できますが、そのあとの名前が文字入力が終わり、エンターを押すとプログラムが止まり、アプリケーションエラーになります。あと'R'を押して文字入力し、そのテキストフォルダがあるはずなのにアプリケーションエラーをはかれ、終了してしまいます。
###該当のソースコード
#include <stdio.h> #include <string.h> void *malloc(size_t size); void free(void *ptr); typedef struct person { char *id; char *name; } Person;
char *my_gets6(){ static int n; static char *s=NULL; if(s==NULL){ n = 10; s = (char *)malloc(n); } int i; for(i = 0; i < n; i++){ char c = getchar(); if(c == '\n'){ s[i] = '\0'; break; } if(i == n - 1){ s[i] ='\0'; n *= 2; char *s2 = (char *)malloc(n); strcpy(s2,s); free(s); s = s2; i = strlen(s); } s[i] = c; } char *s3 = (char *)malloc(strlen(s)+1); strcpy(s3,s); free(s); return s3; }
char *my_fgets6(FILE *fp){ static int n; static char *s=NULL; if(s==NULL){ n = 10; s = (char *)malloc(n); } int i; for(i=0;i<n;i++){ int c = fgetc(stdin); if(c == EOF){ return NULL; } if(c == '\n'){ s[i] = '\0'; break; } if(i == n - 1){ s[i] ='\0'; n *= 2; char *s2 = (char *)malloc(n); strcpy(s2,s); free(s); s = s2; i = strlen(s); } s[i] = c; } char *s3 = (char *)malloc(strlen(s)+1); strcpy(s3,s); free(s); return s3; }
static char *get_file_name(){ printf("ファイル名="); fflush(stdout); char *file_name= my_gets6(); if(strlen(file_name) == 0){ free(file_name); return NULL; } return file_name; } static Person *get_person(){ Person *p=(Person *)malloc(sizeof(Person)); printf("番号="); fflush(stdout); p->id=my_gets6(); if(strlen(p->id)==0){ free(p); return NULL; } printf("名前="); fflush(stdout); p->name =my_gets6(); return p; } static void put_persons(Person **ps, int n){ int i; for (i = 0; i < n; i++) printf("%s %s\n", ps[i]->id, ps[i]->name); }
void meibo20(void) { Person **array = NULL; int array_size = 10; int next_idx = 0; char *file_name; FILE *fp; array = (struct person **) malloc(sizeof(Person *) * array_size); while (1) { char command[2]; printf("コマンドを入力してください="); fflush(stdout); my_gets1(command, 2); switch (command[0]) { Person *workp; case 'I': ; workp = get_person(); if (workp == NULL) { break; } int i; for (i = next_idx - 1; i >= 0; i--) { if (strcmp(array[i]->id, workp->id) < 0) { break; } array[i + 1] = array[i]; } array[i + 1] = workp; next_idx++; break; case 'X': printf("処理を終了します。 \n"); return; case 'W': file_name = get_file_name(); fp = fopen(file_name, "w"); if(fp == NULL){ printf("ファイル %s を作成できませんでした。\n",file_name); continue; } for (i = 0; i < next_idx; i++) { fprintf(fp, "%s\n", array[i]->id); fprintf(fp, "%s\n", array[i]->name); } fclose(fp); break; case 'R': file_name = get_file_name(); fp = fopen(file_name, "r"); if(fp == NULL){ printf("ファイル %s が存在しません。\n", file_name); continue; } while (1) { workp = (Person *) malloc(sizeof(Person)); if((workp->id = my_fgets6(fp)) == NULL){ free(workp); break; } workp->name = my_fgets6(fp); for (i = next_idx - 1; i >= 0; i--) { if (strcmp(array[i]->id, workp->id) < 0) { break; } array[i + 1] = array[i]; } array[i + 1] = workp; next_idx++; break; } break; default: printf("不正なコマンドです。 \n"); break; } } }
###試したこと
my_gets6を読んでいるところをmy_gets1にして出力しても同じエラーになり、case内での間違いを探しても私の力が及ばないせいか見つかりませんでした。どなたかわかる方教えてくださると幸いです。よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
c
エクリプス最新
回答2件
あなたの回答
tips
プレビュー