セグメントエラー
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define MAX_BYTE_SIZE 256
#define JUDGMENT_CODE 1
#define FILE_NAME 2
void Decoding(unsigned char cript[], unsigned char plain[], unsigned char shift)
{
FILE *fout;
int i;
if((fout = fopen("decode.txt", "w"))==NULL)
{
printf("File cannot be opend. \n");
exit(1);
}
printf("\nPlaintext : %s\n", plain);
fprintf(fout, "\nPlaintext : %s\n", plain);
for(shift=1; shift<26; shift++)
{
for(i=0; plain[i]!='\0'; i++)
{
if(plain[i]>0x60 && plain[i]<0x7b) //if(isalpha(plain[i]))
{
cript[i]= plain[i]+ shift;
if(cript[i] > 0x7a)
{
cript[i] = cript[i] - 26;
}
}
else
{
cript[i] = plain[i];
}
}
cript[i]= '\0';
printf("(%d) : %s", shift, cript);
fprintf(fout, "(%d) : %s", shift, cript);
}
fclose(fout);
}
void Encoding(unsigned char cript[], unsigned char plain[], unsigned char shift)
{
FILE *fout;
int i;
if((fout = fopen("encode.txt", "w"))==NULL)
{
printf("File cannot be opend. \n");
exit(1);
}
printf("\nPlaintext : %s\n", plain);
fprintf(fout, "\nPlaintext : %s\n", plain);
printf("暗号化するときのずらす文字数を入力してください\n");
scanf("%d", &shift);
for(i=0; plain[i]!='\0'; i++)
{
if(plain[i]>0x60 && plain[i]<0x7b) //if(isalpha(plain[i]))
{
cript[i]= plain[i]+ shift;
if(cript[i] > 0x7a)
{
cript[i] = cript[i] - 26;
}
}
else if(plain[i]>0x40 && plain[i]<0x5b)
{
cript[i]= plain[i] + 32 + shift;
if(cript[i] > 0x7a)
{
cript[i] = cript[i] - 26;
}
}
else
{
cript[i] = plain[i];
}
}
printf("暗号化すると%s", cript);
fprintf(fout, "文字数を %d ずらして暗号化すると\n %s", shift, cript);
fclose(fout);
}
int main(int argc, char *argv[])
{
FILE *fin;
unsigned char plain[MAX_BYTE_SIZE];
unsigned char cript[MAX_BYTE_SIZE];
unsigned char shift;
if((fin = fopen(argv[FILE_NAME], "r"))==NULL)
{
printf("File cannot be opend. \n");
exit(1);
}
if(strcmp(argv[JUDGMENT_CODE], "-D")==0)
{
fgets(plain, MAX_BYTE_SIZE, fin);
Decoding(cript, plain, shift);
}
else if(strcmp(argv[JUDGMENT_CODE], "-E")==0)
{
fgets(plain, MAX_BYTE_SIZE, fin);
Encoding(cript, plain, shift);
}
fclose(fin);
return 0;
}
を6で実行すると
% ./a.out -E plaintext.txt
Plaintext : toward next generation robotics that supports human future
暗号化するときのずらす文字数を入力してください
6
暗号化するとzucgxj tkdz mktkxgzout xuhuzoiy zngz yavvuxzy nasgt lazaxk
セグメントエラー
となってしまいます。どうしたらセグメントエラーが出てこないようにできますか。
お礼
ありがとうございます。 私の経験から言えばこの型違いはエラーではなく警告になるものという認識がありましたのでXcodeの警告レベル(実際にはエラーなので違うフラグかもしれませんが)等の変更で回避出来ると考えて、そういったフラグの変更箇所を探しておりました。 現にVisualStudioでは警告をエラーとして表示、などのオプションがありますので。 また海外のSDK内のコードですので何故intをunsigned intで初期化しているかはよくわかりません。VisualStudio2008とVisualStudio2010では警告は出たもののビルドは通ったのでLLVMコンパイラ特有のエラーかもしれません。 面倒だったので当該初期化処理の入った関数をHoge.cppから別ファイルのHogeFunc.cに分離し、型チェックがC++よりも甘いCコードとして無理矢理コンパイルしてリンクし動かすことで今回の問題は解決しました。 ありがとうございました。