[英]C - Encryption Algorithm
我正在尝试使用C进行简单的加密程序。我的目标是将abc
(可以是任何单词)转换为123
。 然后乘以2
得到246
然后再转换为文本,然后在屏幕上写入bdf
。 这是我的算法无法正常工作。 我进入了abc
并获得了cbc
。 你能帮助我吗?
int main()
{
int z,o,c,l,i,j,k,*D;
char word[10];
char alfabe[24]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z','\0'};
printf("enter word");
scanf("%s",word);
c=strlen(word);
printf("has %d letters ", c);
D = (int *) malloc( sizeof(int)*c );
for(i=0;i<c;i++) {
for(j=0;j<26;j++) {
if(word[i]==alfabe[j]) {
D[i]=2*(j+1);
break;
}
}
}
printf("\nlast form before translation ");
for(l=0;l<c;l++) {
printf("%d",D[l]); /*it s just for control */
}
for(z=0;z<c;z++){
printf("%c",alfabe[o]);
o=D[z];
word[z]=alfabe[o] ; break; }
printf("\nnew form of word: ");
for(k=0;k<c;k++) {
printf("%c",word[k]);
}
scanf("%d");
}
问题出在以下循环中。
for(z=0;z<c;z++){
printf("%c",alfabe[o]);
o=D[z];
word[z]=alfabe[o] ;
break;
}
你为什么打破? 它只是翻译第一个字符。 其次,您需要减去1以获得正确的字母数组索引(重做您所做的添加)。
word[z]=alfabe[o-1];
第三,你在初始化之前使用o
? 您的编译器应该警告您。 第四,为什么要在24个字符的char数组中存储27个字符?
char alfabe[24]={'a','b',...........,'\0'}
最后但并非最不重要的是,您需要使用模块化算法,如果用户输入类似xyz
,这将不起作用。
好的,首先'\\0'
标志着一个输入字符串的结束,你不需要加密这个特殊的字符,我的建议是把它放在alfabet
这样你就得到:
alfabet[24] = {'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z'};
这将为您省去减1的麻烦,因此您将拥有:
for (i = 0; i < c; i++)
{
for (j = 0; j < 24; j++)
{
if (word[i] == alfabet[j])
{
D[i] = 2 * j;
}
}
}
在您对输入进行编码的部分中。 当您生成输出字时:
for (z = 0; z < c; z++)
{
printf("%c", alfabet[D[z]]);
word[z] = alfabet[D[z]];
}
不需要o
,尤其不需要break;
在循环。
一种更有效的方法是创建一个处理传递的字符串加密的函数:
char* getEncryptedWord(char* word)
{
char alfabet[25]={'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v', 'x', 'y','z'};
int i, j;
int size = strlen(word);
char* encryptedWord = (char*) malloc(size + 1);
for (i = 0; i < size; i++)
{
for (j = 0; j <= 25; j++)
{
if (word[i] == alfabet[j])
{
if (2 * j > 25)
encryptedWord[i] = alfabet[2 * j % 25];
else
encryptedWord[i] = alfabet[2 * j];
break;
}
}
}
encryptedWord[size] = '\0';
return encryptedWord;
}
我在alfabet
添加了'x'
- 这就是为什么现在有25个元素的原因。 我确定缺少一个英文字母的字符,但是凌晨3点,英语不是我的主要语言。 此外,此解决方案正在假设您提供的alfabet
是输入和输出中应该存在的唯一字符。
(提示:如果你只想要字母AZ,你不需要遍历数组来找到相应的数字,你可以通过减去'a'的数值来得到数字,如果你想要的话,可以加1字母'a'映射到1.)
提到了模数运算,但这会给你带来问题,因为你将失去1:1映射,即两个字母最终可以被转换为相同的数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.