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

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

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

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

Q&A

解決済

3回答

18794閲覧

ファイルから読込んだ文字列が文字化け

hokusou7500

総合スコア18

C

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

0グッド

0クリップ

投稿2018/09/03 03:00

編集2018/09/03 03:01

C言語で、タイピングゲームを作成しています。問題文が書かれたtxtファイルを読込んで表示させたいのですが表示させようとすると文字化けしてしまいます。文字化けしないようにするにはどのようにしたらよいでしょうか?以下に、ソースコード、txtファイルの中身、文字化けの結果をupしますので、ご教授よろしくお願いいたします。

C

1int game(){ 2 int level, sent, random, loop; 3 clock_t start, end; 4 int SENT[7]; 5 char Sent[7][100]; 6 char a[50], a1[50]; 7 FILE *A; 8 9 printf("Please select level\n"); 10 printf(" 1.Easy\n"); 11 printf(" 2.Normal\n"); 12 printf(" 3.Difficult\n"); 13 scanf("%d", &level); 14 15 srand((unsigned int)(time(NULL))); 16 for(loop=0;loop<7;loop++){ 17 SENT[loop] = (rand()%7)+1+(level-1)*10; //問題文をランダムで選択(1~10の中から7つ) 18 sprintf(Sent[loop],"Sent\%d.txt", SENT[loop]); 19 //printf("%d\n", SENT[loop]); 20 } 21 22 A = fopen(Sent[0],"r"); 23 for(loop=0;loop<50;loop++){ 24 fscanf(A, "%s", &a[loop]); 25 } 26 27 printf("\n"); 28 sleep(1); 29 printf("3 "); 30 sleep(1); 31 printf("2 "); 32 sleep(1); 33 printf("1 "); 34 sleep(1); 35 printf("Start!!\n"); 36 37 start = clock(); 38 39 for(loop=0;loop<50;loop++){ 40 printf("%s", &a[loop]); 41 } 42 printf("\n"); 43 scanf("%s", a1); 44 if (strcmp(a,a1) == 0){ 45 printf("GOOD!\n"); 46 }else{ 47 printf("MISS!\n"); 48 } 49 50 end = clock(); 51}

7.txt

boal

結果

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

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

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

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

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

t_obara

2018/09/03 03:10

実行環境は何ですか?Windows?txtファイルの文字コードは何ですか?UTF8?
hokusou7500

2018/09/03 03:21

Windowsで、MinGWを使用しています。txtファイルの文字コードはUTF8です。情報が足りず申し訳ありません。
guest

回答3

0

ベストアンサー

こんにちは。

まず、下記の読み込みが間違っています。

C

1 A = fopen(Sent[0],"r"); 2 for(loop=0;loop<50;loop++){ 3 fscanf(A, "%s", &a[loop]); 4 }

「文字列(%s)」を50個読んでいますね。
そもそも文字列自体は1つしかないですし、しかもたった4文字です。完全に読みすぎです。
読み過ぎの部分はエラーが発生して読み込まれていないと思います。
ですので、最初の1回だけ機能し、最初の1行だけが読み込まれている筈です。

UTF-8エンコードし、かつ、BOM有りにあすると最初の3文字はBOMとなります。通常のテキスト・エディタでは表示されませんが、このように読み込むと「謎」の3文字が読まれます。それがboalの前に表示されている3文字です。
その後、1文字づつずらしながら、繰り返しa配列を「文字列」として出力しているので、頭から1文字づつ減った同じ文字列が繰り返しでています。
そして、BOM+boalがNULL終端した後は、未初期化のままですので「ゴミ」がはいっていて、それらがでています。

「文字(%cで処理する)」と「文字列(%sで処理する)」の相違をきちんと把握できれば修正できると思いますよ。

投稿2018/09/03 03:54

Chironian

総合スコア23272

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

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

hokusou7500

2018/09/03 04:10

丁寧に説明していただきありがとうございます。Chironian様のアドバイスのおかげでうまく動作させることができました!自分の勉強不足で恥ずかしい限りです・・・。ベストアンサーにさせていただきました。今後もよろしくお願いいたします。
guest

0

C

1 for(loop=0;loop<50;loop++){ 2 fscanf(A, "%s", &a[loop]); 3 }

これはなにを意図してるんでしょうか。
まともに動くコードではないです

#ツッコミどころは他にもあります

投稿2018/09/03 03:38

y_waiwai

総合スコア87747

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

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

hokusou7500

2018/09/03 03:48

txtファイルから文字列を読み込むために書いたコードです。一文字ずつ読み込んで配列に格納しようと思って書いたコードでしたが、それならば指定子は%c、ですかね・・・。もしよろしければ他のツッコミどころも教えていただきたいです。
y_waiwai

2018/09/03 03:58

ファイルに一つの文字列があってそれを読むなら fscanf(A, "%s", &a[0]); だけでいけます。 ただし、ファイルの文字列のバイト数がaのサイズを超えると破綻します 同じようなツッコミどころは、 for(loop=0;loop<50;loop++){ printf("%s", &a[loop]); } とかですね
hokusou7500

2018/09/03 04:11

ありがとうございます!修正し動作させることができました。アドバイスありがとうございました!!
guest

0

実行しているコマンドプロンプトの文字コードと、
問題文のtxtファイルの文字コードが異なっているためです。

コマンドプロンプトの文字コードは、chcpというコマンドでわかります。
txtファイルの文字コードは、保存するテキストエディタの使い方を調べてください。

投稿2018/09/03 03:16

taka-saan

総合スコア665

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

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

hokusou7500

2018/09/03 03:37

回答ありがとうございます。コマンドプロンプトの文字コードを変更しtxtファイルの文字コード(UTF-8)と合わせたのですが、表示させる文字列が以下のようになってしまいました。これは、ファイルを開くときに問題が起きているのでしょうか? freefreefreefreereeeee4a4a4aaasLsLsLsLLmsmsssaaa (txtファイルの中身:free)
taka-saan

2018/09/03 04:42 編集

文字コードは一致しましたが、今度はプログラムに原因があります。 y_waiwaiさんからの指摘にもあるように、a[]の使い方に誤りがありますね。 問題文が50行あるのであれば、ファイル名の生成のところと同様に、2次元配列にしないといけません。 下の方のprintfのところもです。 あと、変数名にはもう少し変数の内容にふさわしいものをつけるように 心がけるとよろしいかと思います。 こういう場で人見せるときのためや、後で自分でもわからなくなります。
taka-saan

2018/09/03 04:12

問題文が1ファイルに50行あるのかと思った。低評価くやしいorz
hokusou7500

2018/09/03 04:13

アドバイスありがとうございます!修正し動作させることができました。変数名を適当につけちゃうのは悪い癖なので直したいと思います・・・。質問してすぐの回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問