下記のプログラムを実行したとき種族と得意技を入力して終了し呼び出しをかけたとき種族と得意技の部分が文字化けなのかよくわからないことが起きてうまく表記されません。なにかまずい部分はありますでしょうか?プログラムは長いですがよろしくお願いします。苦しんで覚える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;
}
結果が文字化けのようになってしまう
Re: 結果が文字化けのようになってしまう
とりあえず、プログラムがcodeタグで囲まれていないことでしょう。メル さんが書きました:なにかまずい部分はありますでしょうか?プログラムは長いですがよろしくお願いします。苦しんで覚えるC言語というものを使っています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 結果が文字化けのようになってしまう
すみません。
#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;
}
Re: 結果が文字化けのようになってしまう
この部分は、書式%dはint*型のデータを要求するのに、&tipeはchar(*)[4]型、&addressはchr(*)[64]型なので、
型が一致せず、undefined behaviorになります。
]とすればundefined behaviorとバッファオーバーランのリスクを回避できるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 結果が文字化けのようになってしまう
うまくいきました。ありがとうございます!
追加で質問なのですがプログラムを終了してもう一度同じプログラムを起動して呼び出しをかけると終了したはずのプログラムが残ってしまうのですが消したりできないんでしょうか?
追加で質問なのですがプログラムを終了してもう一度同じプログラムを起動して呼び出しをかけると終了したはずのプログラムが残ってしまうのですが消したりできないんでしょうか?
Re: 結果が文字化けのようになってしまう
どのようにして確認されましたか?メル さんが書きました: 終了したはずのプログラムが残ってしまう
ところで…
他の人たちがどういう風にコードを書いているかをよく観察して、
字下げ(インデント)について勉強する方がよいと思います。
くだんのコードは見づらくて…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。