こんにちは。プログラミング初心者です。C言語を使った簡潔なプログラミングの練習をしており、コンピュータと対戦型のしりとりのゲームをつくったのですが、うまく実行されず困っています。Visual Studioでコードを書いて、Cygwinで実行しています。
以下にコードを示します。
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#include<time.h> 5 6int entry(char abc[][50]) { 7 char xy[4]; 8 int n = 0; 9 FILE *fp; 10 printf("(登録)先頭文字を入力:"); 11 scanf("%s", xy); 12 fp = fopen(xy, "a"); 13 printf("入力:"); 14 scanf("%s", abc[n]); 15 fprintf(fp, "%s\n", abc[n]); 16 fclose(fp); 17 return 0; 18}/*例:「あ」というファイルをつくり「あ」から始まる単語をそこに登録する*/ 19 20int view(char abc[][50]) { 21 char xy[4]; 22 int n = 0, getEof; 23 FILE *fp; 24 printf("(閲覧)先頭文字を入力:"); 25 scanf("%s", xy); 26 fp = fopen(xy, "r"); 27 while((getEof = getc(fp)) != EOF){ 28 fscanf(fp, "%s", &abc[n]); 29 printf("%s\n", abc[n]); n++; 30 } 31 fclose(fp); 32 return 0; 33}
ここで気になっているのは、登録は1つずつ"a"でファイルの追加書きこみをしていきたいので、entryの関数で変数nを使って2次元配列にする意味はなさそうだけれど、viewの関数ではまとめて閲覧したいので変数nなどが必要だということです。この場合どのように書けばいいのでしょうか。
C
1int battle(char abc[][50]) { 2 char input[50], st[4], us[4]="ん"; 3 int m = 0, n = 0, u = 0, getEof; 4 FILE *fp; 5 printf("\nあなたから始めてください\n"); 6 while (1) { 7 printf("ひらがな入力のみ\n\n"); 8 scanf("%s", input); 9 /*strlenで文字数を数えて結果をprintfしたところ、 10 全角1文字につき3バイトだった*/ 11 m = strlen(input); 12 m /= 3; 13 memcpy(st, input + (m - 1) * 3, 3); 14 if (strcmp(st, us) == 0) { 15 printf("おわり\n\n"); break; 16 }/*最後の文字だけ抜き取って「ん」かどうか調べる*/ 17 fp = fopen(st, "r"); 18 srand(time(NULL)); 19 while ((getEof = getc(fp)) != EOF) { 20 fscanf(fp, "%s", &abc[n]); 21 n++; 22 }/*最後の文字が「ん」でない場合、その文字と同じ名前のファイルから ランダムに単語を取り出す*/ 23 n = rand() % (n - 1);/*最後にn++;して1増えた分を減らす*/ 24 printf("%s\n", abc[n]); 25 u = strlen(abc[n]); 26 u /= 3; 27 memcpy(st, abc[n] + (u - 1) * 3, 3); 28 printf("%s", st); 29 if (strcmp(st, us) == 0) { 30 printf("おわり\n\n"); break; 31 }/*取り出した単語にも「ん」かどうかの判定*/ 32 } 33 fclose(fp); 34 return 0; 35} 36 37int main(void) { 38 char abc[100][50]; 39 int menu = 0; 40 while (menu != 4) { 41 printf("\n***しりとり***\n"); 42 printf("1:登録\n"); 43 printf("2:閲覧\n"); 44 printf("3:開始\n"); 45 printf("4:終了\n\n>"); 46 scanf("%d", &menu); 47 system("clear"); 48 if (menu == 1) entry(abc); 49 else if (menu == 2) view(abc); 50 else if (menu == 3)battle(abc); 51 } 52 return 0; 53}
<実行結果>
登録は問題なくできるようですが、閲覧の際に最初と最後の文字化けが発生します。ファイルの中身は文字化けしていません。
別の文字でもファイルを登録してみます。新しい方のファイルを閲覧すると、前につくったファイルの中身がくっついて表示されました。しかし、ファイルの中身自体にやはり問題はありません。
実際にしりとりをしてみると、間違ったファイルが選ばれています。見にくくてすみません。れあ、すいえい、いさかいを手打ちしました。最初の文字に判定はいれていないのでこれで問題ないはずです。「ん」を入力するとbreak;できています。
「あ」や「い」という異なるファイルを同じ配列で開いたことで起きてしまった現象なのでしょうか。改善策を知りたいです。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/25 08:55