我正在尝试用C语言制作一个简单的加密程序。我的目标是将"jim"(可以是任何单词(翻译成10,9,13。然后加上 1,2,3(因为单词有 3 个字母(并得到 11,12,16,然后再次翻译成文本,然后在屏幕上写下 klp。我有 2 种算法,一种用于加密,第二种用于返回第一个。它正在工作,但对于这些词存在问题"编译器你通过可执行"当我启动第一个算法,然后第二个算法(逆(我采取。Compileo vou euecrqable Throrgh "我检查了几次算法,我不知道我在哪里忽略了
PS:如果要运行名为未加密的txt文件.txt并在其中写入单词,然后是第一个算法,然后是第二个算法
int main() {
int g,z,o,c,l,i,j,k,*D;
char alfabe[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
FILE *fp1;
FILE *mat;
char word[20];
fp1 = fopen("unencrypted.txt","r+");
do {
g = fscanf(fp1,"%s",word);
if (g != EOF) {
mat=fopen("encrypted.txt","a+");
c=strlen(word);
D=(int*)calloc(c,sizeof(int));
for(i=0;i<c;i++) {
for(j=0;j<26;j++) {
if(word[i]==alfabe[j]) {
D[i]=(((j+1)+(i+1))%26);
break;
}
}
}
}
for(z=0;z<c;z++){
o=D[z];
word[z]=alfabe[o-1];
}
for(k=0;k<c;k++) {
fprintf(mat,"%c",word[k]);
}
fprintf(mat," ");
fclose(mat);
} while (g != EOF);
fclose(fp1);
}
int main() {
int g,z,o,c,l,i,j,k,*D;
char alfabe[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
FILE *fp1;
FILE *mat;
char word[20];
fp1 = fopen("encrypted.txt","a+");
do {
g = fscanf(fp1,"%s",word);
if (g != EOF) {
mat=fopen("unencrypted1.txt","a+") ;
c=strlen(word);
D=(int*)calloc(c,sizeof(int));
for(i=0;i<c;i++) {
for(j=0;j<26;j++) {
if(word[i]==alfabe[j]) {
if(0>((j+1)-(i+1))){
D[i]=((j+1)-(i+1)+26);
} else D[i]=((j+1)-(i+1));
break;
}
}
}
}
for(z=0;z<c;z++){
o=D[z];
word[z]=alfabe[o-1];
}
for(k=0;k<c;k++) {
fprintf(mat,"%c",word[k]);
}
fprintf(mat," ");
fclose(mat);
} while (g != EOF);
fclose(fp1);
}
首先,在加密例程中,您可以有未定义的行为:
word[z]=alfabe[o-1];
访问内存 如果o == 0
,则不应该访问内存,如果单词中字符的 1 个索引和字母表中从 1 开始的索引之和是 26 的倍数,就会发生这种情况。
为避免这种情况,您可以设置 word[z] = alfabe[(o+25)%26]
,或者更简单地说,在上一个循环中省略其中一个+1
并使用 alfabe[o]
。
alfabe[-1]
的访问,如果发生,是一种不太可能导致分段错误或类似激烈事情的未定义行为,它可能只会导致在加密字中写入意外字节。
在解密中,您也有类似的问题,
if(0>((j+1)-(i+1))){
D[i]=((j+1)-(i+1)+26);
} else D[i]=((j+1)-(i+1));
如果单词足够长,即使j - i + 26
也可能是负面的(但是,对于自然英语文本来说,这是极不可能的 - 在许多其他语言中也是如此(。
同样,D[i]
可能会设置为 0,在这种情况下
for(z=0;z<c;z++){
o=D[z];
word[z]=alfabe[o-1];
}
将再次访问alfabe[-1]
并导致未定义的行为。
另请注意,如果您的输入包含除小写字母和空格(被fscanf
丢弃(之外的任何内容,则D
数组的相应条目包含该内存位置发生的任何字节,再次导致未定义的行为。
如果您的输入仅包含小写字母(和空格(,则可以通过设置
j = word[i] - 'a';
为了避免alfabe[-1]
问题,我建议使用从 0 开始的索引。