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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

2633閲覧

しりとりのプログラムがうまく動きません

gate-snow

総合スコア10

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2018/10/21 08:51

編集2018/10/21 08:55

こんにちは。プログラミング初心者です。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;できています。

イメージ説明

「あ」や「い」という異なるファイルを同じ配列で開いたことで起きてしまった現象なのでしょうか。改善策を知りたいです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

閲覧での問題ですが、 下記の部分

while((getEof = getc(fp)) != EOF){ fscanf(fp, "%s", &abc[n]); printf("%s\n", abc[n]); n++; }

でwhileの条件式でgetc()でEOFチェックを入れているのが原因です。
getc()で1文字読み込んだ後にファイルポインタが一文字文進んだ場所を指すので、fscanfで文字列を読み込む際に、最初のひらがなの先頭バイトが欠落した状態で読み込まれるため文字化けが発生しています。
なので

c

1while(fscanf(fp, "%s", &abc[n]) != EOF){ 2 printf("%s\n", abc[n]); n++; 3}

これで文字化けは無くなります。

投稿2018/10/21 12:32

編集2018/10/21 12:41
KoichiSugiyama

総合スコア3041

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

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

gate-snow

2018/10/25 08:55

ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問