あるゲームでランキングに入賞したら名前を登録する関数を作ってみたのですが、上手く動作しません。
コンパイルしたときにエラーは吐きません。
この関数を作る条件に
①名前の入力にはfgets関数を用いる。(scanf関数は使わない。)
②ASCIIコードを使う。(環境依存は気にしなくてもよい。)(自分の環境にあわせたASCIIコードを使っている。)
③文字の判定に既存の関数は使わず、自力で判定する。(isalpha関数などは使わない。)
④使用可能文字は、(小文字、大文字、空白(' ')、コンマ('.'))
C
1void input_name(char player_name[]){ 2 int i,j,flag; 3 int alpha[54]; 4 size_t length; 5 6 //使用可能の文字をリストにいれる 7 // a~z 8 for (i = 97, j = 0; i <= 121; i++){ 9 alpha[j++] = i; 10 } 11 // A~Z 12 for (i = 65; i <= 89; i++){ 13 alpha[j++] = i; 14 } 15 // .(コンマ) 16 alpha[52] = 32; 17 // " "(空白) 18 alpha[53] = 46; 19 20 //名前を入力し、使用可能か判定する 21 while(1){ 22 flag = 0; 23 if (fgets(player_name, 10, stdin) == NULL || player_name[0] == '\n'){ 24 puts("名前は1~10文字で入力してください。"); 25 continue; 26 } 27 length = strlen(player_name); 28 if (player_name[length - 1] == '\n') 29 player_name[--length] = '\0'; 30 for (i = 0; i < length; i++){ 31 int useable; 32 useable = 0; 33 for (j = 0; j < 54; i++){ 34 if (player_name[i] == alpha[j]) 35 useable = 1; 36 if (!useable){ 37 puts("英字、数字、空白、ピリオド以外の文字は使わないでください。"); 38 flag = 1; 39 break; 40 } 41 if (flag == 1) 42 break; 43 } 44 } 45 if (flag == 0) 46 break; 47 } 48}
実行例①
名前を入力してください
名前は1~10文字で入力してください。
aiueo
Segmentation fault
実行例②
名前を入力してください
名前は1~10文字で入力してください。
"aiueo"
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
123 .
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
英字、数字、空白、ピリオド以外の文字は使わないでください。
名前は1~10文字で入力してください。
期待する実行例①
名前を入力してください
aiueo12 .
期待する実行例②
名前を入力してください
aiu@a
英字、数字、空白、ピリオド以外の文字は使わないでください。
名前を入力してください
aiueoaifusidfusiodfusiofaid
名前は1~10文字で入力してください。
aiueo
問題点
①aiueoと入力したときに出力される、Segmentation faultと出力される
②名前を入力する前に、なぜか「名前は1~10文字で入力してください。」が出力される。
追記
typedef struct {
double score;
char name[256];
}player;
int main(void){
:
:
player players[RANKING_SIZE+1];
:
:
input_name(players[your_ranking].name);
:
:
今回作ったinput_name関数はmain関数内でこのような背景を持って呼び出されています。
回答8件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/19 14:40 編集
2018/01/19 14:42
2018/01/19 15:04
2018/01/19 22:24 編集