拡張子をtxtファイルと、binファイルの両方で試したのですが同じように文字化けします。
ファイルの読み込み方が悪いのでしょうか?
読み込むファイル char_data.txt
Alice 1 15 10 8
Slime 1 10 8 3
Skeleton 2 15 11 7
Ghost 3 20 14 10
Dragon 100 3000 3000 300
//----------------------------------------------------
//ソース全文
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <windows.h>
#define N 5
typedef struct gamechar{
char name[32];
int lv;
int hp;
int mp;
int atk;
}GC;
void file_read(GC gc[]);
void status(GC pc, GC mc[], GC mc_copy[], int *num, int *lot);
void mons_change(GC pc, GC mc[], int *num);
void mons_multi(GC mc[], GC mc_copy[], int *num, int *lot);
int main(void)
{
int num=0, lot=0; //モンスターの種類選択用、複数作成用
GC gc[N];
GC pc; //プレイヤーキャラ用
GC mc[N]; //モンスター用
GC mc_copy[N]; //モンスターを複数作成する時用
srand((unsigned)time(NULL));
file_read(gc);
//ファイルデータ読み込み終了
memcpy(mc, gc, sizeof(gc));
pc=mc[0]; //mc[0]はプレイヤーキャラ
mons_change(pc, mc, &num);
mons_multi(mc, mc_copy, &num, &lot);
status(pc, mc, mc_copy, &num, &lot);
return 0;
}
void mons_multi(GC mc_copy[], GC mc[], int *num, int *lot)
{
*lot=rand()%5;
for(int i=0; i<(*lot); ++i){
mc_copy[i]=mc[*num];
}
}
//モンスターランダム切り替え
void mons_change(GC pc, GC mc[], int *num)
{
*num=rand()%N; // モンスターの種類を変える
}
//データファイル読み込み
void file_read(GC gc[])
{
FILE *fp;
int i=0;
if(fopen_s(&fp, "char_data.txt", "r")!=0){
exit(EXIT_FAILURE);
}
while(fscanf_s(fp,"%s%d%d%d%d", gc[i].name, _countof(gc[i].name), &gc[i].lv, &gc[i].hp, &gc[i].mp, &gc[i].atk)!=EOF){
++i;
}
fclose(fp);
}
// ステータス表示
void status(GC pc, GC mc[], GC mc_copy[], int *num, int *lot)
{
system("cls");
// printf("num 0:player_char 1:Slime 2:Skeleton 3:Ghost 4:Dragon\n\n");
puts("--------------------------------------------");
printf(" Lv%-4d%-16sHP%-10dMP%-10d\n", pc.lv, pc.name, pc.hp, pc.mp);
puts("");
printf(" %-36s%-1d匹\n", mc[*num].name, *lot);
puts("--------------------------------------------");
for(int i=0; i<(*lot); ++i){
printf(" %-37s%-1d\n", mc_copy[*num].name, i);
}
}
No.5ベストアンサー
- 回答日時:
GC mc[N] = { //モンスター用
{ "m0", 0, 0, 0, 0 },
{ "m1", 0, 0, 0, 0 },
{ "m2", 0, 0, 0, 0 },
{ "m3", 0, 0, 0, 0 },
{ "m4", 0, 0, 0, 0 }
};
GC mc_copy[N] = { //モンスターを複数作成する時用
{ "mc0", 0, 0, 0, 0 },
{ "mc1", 0, 0, 0, 0 },
{ "mc2", 0, 0, 0, 0 },
{ "mc3", 0, 0, 0, 0 },
{ "mc4", 0, 0, 0, 0 }
};
こんな感じにしておくと…少なくとも「未初期化のローカル変数」参照で文字化け(ゴミ)が表示されることはなくなるかと思いますよ。
memset()で構造体配列を0x00埋めしてしまう。というのも有りかもしれませんが。
ただし、その場合は
>printf(" %-37s%-1d\n", mc_copy[*num].name, i);
などで表示される文字列はなにもなし…になりますけどね。
No.3
- 回答日時:
>何度か実行すると、やはり文字化けしてしまいます。
デバッグは自分でやってほしいところですが……。
>for(int i=0; i<(*lot); ++i){
> printf(" %-37s%-1d\n", mc_copy[*num].name, i);
>}
ループでぐりぐり回る(変化する)のはiです。
名前(?)の表示は第宇引数で渡された値です。
第4引数で渡される値は第5引数で渡される値より小さいことが保証されていますか?
No.2
- 回答日時:
>ファイルの読み込み方が悪いのでしょうか?
ファイルから読み込んだ内容を捨てているからでは?
>file_read(gc);
で、gc[]に読み込みます。
>memcpy(mc, gc, sizeof(gc));
で、gc[]の内容をmc[]にコピーします。
>mons_multi(mc, mc_copy, &num, &lot);
で、未初期化のmc_copy[]をmc[]にコピーします。
>status(pc, mc, mc_copy, &num, &lot);
で、未初期化のmc_copy[]を表示しようとします。
>printf(" %-37s%-1d\n", mc_copy[*num].name, i);
の部分ね。
関数に渡す変数と、関数側で受け取って使っている仮引数の名前に注意するべきでしょう。
>mons_multi(mc, mc_copy, &num, &lot);
では、第1引数はmc[]、第2引数はmc_copy[]で渡しています。
が、受け取る
>void mons_multi(GC mc_copy[], GC mc[], int *num, int *lot)
では、第1引数がmc_copy[]で第2引数がmc[]です。
処理内容により、mc[]からmc_copy[]にコピーされます。
つまり、mons_multi()の中では下記の対応になります。
mc_copy[] => main()のmc[]
mc[] => main()のmc_copy[]
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
縦横比率のを変えずに画像のサ...
-
テキストファイルから読み込ん...
-
四角形の端っこをドラッグした...
-
ラッコって?
-
看護師です。体温表のマクロを...
-
VBAで改行の入ったデータの正規...
-
VBScriptでMsgBoxのYesNoボック...
-
【VB.NET】別Formのボタンが押...
-
C# chart controlの透過について
-
static関数がmapファイルに載ら...
-
プログラミング、アーキテクチ...
-
ACCESSフォームで、入力から一...
-
Actionscriptでふわふわ感を再...
-
画面の範囲選択
-
アセンブリ言語のcasl2について...
-
'2465'指定した式で参照してい...
-
POIでのテキストボックス作成に...
-
C言語でのマウスを移動とマウス...
-
python ボタンを押すと複数の関...
-
photoshopで書いた四角の枠の中...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで改行の入ったデータの正規...
-
VBAユーザーホームテキストボッ...
-
テキストファイルから読み込ん...
-
Flashで外部jpgファイルをmcに...
-
FlashでドラッグしたMCをリセッ...
-
AS3 mc0~5をまとめて処理する
-
upc 7915と mc7915ctは互換性有...
-
ラッコって?
-
縦横比率のを変えずに画像のサ...
-
テキスト入力
-
ステージの背景画像のみ拡大縮...
-
eval関数を利用して複数の処理...
-
ランダムに mcを連続attachM...
-
外部SWFファイルを再生バーでコ...
-
四角形の端っこをドラッグした...
-
看護師です。体温表のマクロを...
-
as3 addchildで生成したMCにリ...
-
Flashからリンクする際のconfir...
-
以下のActionScriptをスッキリ...
-
Suzukaで一行ニュースティッカ...
おすすめ情報
ありがとうございます。
残念ながら、メモ帳からANSIを選んで保存しても同じでした。
他のテキストエディタ”Notepad++、CresentEve、Visual Stadio Codeなど”でシフトJISを選択して保存しても同じでした。
また、何かわかりましたらよろしくお願いします。
ありがとうございます。
早速見直して、実行してみました。
void status(GC pc, GC mc[], GC mc_copy[], int *num, int *lot);
void mons_change(GC pc, GC mc[], int *num);
void mons_multi(GC mc_copy[], GC mc[], int *num, int *lot);
status(pc, mc, mc_copy, &num, &lot);
mons_change(pc, mc, &num);
mons_multi(mc_copy, mc, &num, &lot);
変更後、文字化けせずに読み込めるようになりましたが、完全ではありませんでした。
何度か実行すると、やはり文字化けしてしまいます。
また何かわかりましたら、よろしくお願いします。
初期化の説明を参考にいろいろやってみた結果、これで解決できました。
memcpy(mc, gc, sizeof(gc));
memcpy(mc_copy, gc, sizeof(gc));
memcpyで両方ともやってみたら、文字化けしなくなりました。
ありがとうございました。