結果が文字化けのようになってしまう

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
メル

結果が文字化けのようになってしまう

#1

投稿記事 by メル » 9年前

下記のプログラムを実行したとき種族と得意技を入力して終了し呼び出しをかけたとき種族と得意技の部分が文字化けなのかよくわからないことが起きてうまく表記されません。なにかまずい部分はありますでしょうか?プログラムは長いですがよろしくお願いします。苦しんで覚えるC言語というものを使っています。

#define FNAME"meio.txt"
#define RECORDLEN 88

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int menu();
int myread();
int myrite();

char*format="%-15s %-3d %-2s %-63s\n";

int main()
{
int menuno;

while(1){
menuno=menu();
switch(menuno){
case 0:
break;
case 1:
mywrite();
break;
case 2:
myread();
break;
default:
printf("番号が違います\n");
break;
}
if(!menuno)
break;
}

return 0;
}
int menu()
{
char ret[8];

while(1){
printf("-----------------------\n");
printf("1:データ書き込み(新規・追加)\n");
printf("2:データ読み出し\n");
printf("0:終了\n");
printf("-----------------------\n");
printf("あなたが選んだ番号--->");
fgets(ret,sizeof(ret),stdin);
ret[1]='\0';
if(ret[0]<'0'||ret[0]>'2'){
printf("番号が違います\n");
continue;
}
return atoi(ret);
}
}
int mywrite()
{
FILE*fp;
char name[16],tipe[4],address[64],buffer[8];
int age;

fp=fopen(FNAME,"a");
if(fp==NULL){
perror("ファイルを開けません\n");
return -1;
}while(1){
printf("名前--");
fgets(name,sizeof(name),stdin);
name[strlen(name) - 1]='\0';
printf("強さ(1~100)--");
fgets(buffer,sizeof(buffer),stdin);
age=atoi(buffer);
printf("種族--");
fgets(tipe,sizeof(tipe),stdin);
tipe[strlen(tipe) - 1]='\0';
printf("得意技--");
fgets(address,sizeof(address),stdin);
address[strlen(address) - 1] = '\0';

if(fprintf(fp,format,name,age,tipe,address)<0){
perror("エラーが発生しました");
break;
}
printf("入力を続けますか?(y/n):");
fgets(buffer,sizeof(buffer),stdin);
if(buffer[0]=='n'||buffer[0]=='N')
break;
}

fclose(fp);
return 0;
}

int myread()
{
FILE*fp;
char search[16],yesno[8],name[16],tipe[4],address[64];
int no=0,find=0,age;

fp=fopen(FNAME,"r");

if(fp==NULL){
perror("ファイルが開けません\n");
return-1;
}

printf("検索する名前--");
fgets(search,sizeof(search),stdin);
search[strlen(search)-1]='\0';

while(1){
fseek(fp,RECORDLEN*no++,SEEK_SET);
if(fscanf(fp,"%s",name)==EOF)
break;
if(strstr(name,search)!=NULL){
find++;
fscanf(fp,"%d",&age);
fscanf(fp,"%d",&tipe);
fscanf(fp,"%d",&address);
printf("名前:%s\n",name);
printf("強さ(1~100):%d\n",age);
printf("種族:%s\n",tipe);
printf("得意技:%s\n",address);
printf("--------------------\n");
printf("つづけますか(Y/N):");
fgets(yesno,sizeof(yesno),stdin);
if(yesno[0]=='y'||yesno[0]=='Y')
continue;
else
break;
}}
printf("%d件が検索されました\n",find);
fclose(fp);
return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 結果が文字化けのようになってしまう

#2

投稿記事 by みけCAT » 9年前

メル さんが書きました:なにかまずい部分はありますでしょうか?プログラムは長いですがよろしくお願いします。苦しんで覚えるC言語というものを使っています。
とりあえず、プログラムがcodeタグで囲まれていないことでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

メル

Re: 結果が文字化けのようになってしまう

#3

投稿記事 by メル » 9年前

すみません。

コード:

#define FNAME"meio.txt"
#define RECORDLEN 88

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int menu();
int myread();
int myrite();

char*format="%-15s %-3d %-2s %-63s\n";

int main()
{
	int menuno;

	while(1){
	menuno=menu();
	switch(menuno){
	case 0:
	break;
	case 1:
	mywrite();
	break;
	case 2:
	myread();
	break;
	default:
	printf("番号が違います\n");
	break;
	}
	if(!menuno)
	break;
	}

	return 0;
}
int menu()
{
	char ret[8];

	while(1){
	printf("-----------------------\n");
	printf("1:データ書き込み(新規・追加)\n");
	printf("2:データ読み出し\n");
	printf("0:終了\n");
	printf("-----------------------\n");
	printf("あなたが選んだ番号--->");
fgets(ret,sizeof(ret),stdin);
	ret[1]='\0';
	if(ret[0]<'0'||ret[0]>'2'){
	printf("番号が違います\n");
	continue;
	}
	return atoi(ret);
	}
}
int mywrite()
{
	FILE*fp;
	char name[16],tipe[4],address[64],buffer[8];
	int age;

	fp=fopen(FNAME,"a");
	if(fp==NULL){
	perror("ファイルを開けません\n");
	return -1;
	}while(1){
	printf("名前--");
fgets(name,sizeof(name),stdin);
	name[strlen(name) - 1]='\0';
	printf("強さ(1~100)--");
fgets(buffer,sizeof(buffer),stdin);
	age=atoi(buffer);
	printf("種族--");
fgets(tipe,sizeof(tipe),stdin);
	tipe[strlen(tipe) - 1]='\0';
	printf("得意技--");
fgets(address,sizeof(address),stdin);
	address[strlen(address) - 1] = '\0';

	if(fprintf(fp,format,name,age,tipe,address)<0){
	perror("エラーが発生しました");
break;
	}
	printf("入力を続けますか?(y/n):");
	fgets(buffer,sizeof(buffer),stdin);
	if(buffer[0]=='n'||buffer[0]=='N')
	break;
	}

	fclose(fp);
	return 0;
}

int myread()
{
	FILE*fp;
	char search[16],yesno[8],name[16],tipe[4],address[64];
	int no=0,find=0,age;

	fp=fopen(FNAME,"r");

	if(fp==NULL){
	perror("ファイルが開けません\n");
	return-1;
	}

	printf("検索する名前--");
fgets(search,sizeof(search),stdin);
	search[strlen(search)-1]='\0';

	while(1){
	fseek(fp,RECORDLEN*no++,SEEK_SET);
	if(fscanf(fp,"%s",name)==EOF)
	break;
	if(strstr(name,search)!=NULL){
	find++;
	fscanf(fp,"%d",&age);
	fscanf(fp,"%d",&tipe);
	fscanf(fp,"%d",&address);
	printf("名前:%s\n",name);
	printf("強さ(1~100):%d\n",age);
	printf("種族:%s\n",tipe);
	printf("得意技:%s\n",address);
	printf("--------------------\n");
	printf("つづけますか(Y/N):");
	fgets(yesno,sizeof(yesno),stdin);
	if(yesno[0]=='y'||yesno[0]=='Y')
	continue;
	else
	break;
	}}
	printf("%d件が検索されました\n",find);
	fclose(fp);
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 結果が文字化けのようになってしまう

#4

投稿記事 by みけCAT » 9年前

メル さんが書きました:

コード:

			fscanf(fp,"%d",&tipe);
			fscanf(fp,"%d",&address);
この部分は、書式%dはint*型のデータを要求するのに、&tipeはchar(*)[4]型、&addressはchr(*)[64]型なので、
型が一致せず、undefined behaviorになります。
]

コード:

			fscanf(fp,"%3s",tipe);
			fscanf(fp,"%63s",address);
とすればundefined behaviorとバッファオーバーランのリスクを回避できるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

メル

Re: 結果が文字化けのようになってしまう

#5

投稿記事 by メル » 9年前

うまくいきました。ありがとうございます!
追加で質問なのですがプログラムを終了してもう一度同じプログラムを起動して呼び出しをかけると終了したはずのプログラムが残ってしまうのですが消したりできないんでしょうか?

box
記事: 2002
登録日時: 14年前

Re: 結果が文字化けのようになってしまう

#6

投稿記事 by box » 9年前

メル さんが書きました: 終了したはずのプログラムが残ってしまう
どのようにして確認されましたか?

ところで…
他の人たちがどういう風にコードを書いているかをよく観察して、
字下げ(インデント)について勉強する方がよいと思います。
くだんのコードは見づらくて…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

メル

Re: 結果が文字化けのようになってしまう

#7

投稿記事 by メル » 9年前

うまくいったのでありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る