奇怪的错误char的加密(ascii)

时间:2016-04-01 19:45:05

标签: c++ encryption ascii

这是一个简单的代码,但我无法理解一个奇怪的事件。 代码:

void Crittografia::CifraTesto(char text[]){
    int i;
    for (i=0;i<strlen(text);i++){
        text[i]=text[i] + key;
        if(text[i] > 'z'){
            text[i]=text[i] - 26;
        }
    }
}

该函数接收此处输入的字符串: It works
在这种情况下,它使用5的键''y'在'd'中正确更改。

但在这种情况下:Doesn't work
使用7的键,它会在'Ç'中改变'y'而不是正确的'f',所以显然不会执行该行:“text [i] = text [i] - 26;”

3 个答案:

答案 0 :(得分:4)

  

text [i] = text [i] + key;

当密钥为7且text[i]'y'时,添加结果不适合char(似乎您的字符已签名),结果已实现定义。

您最好在添加中使用模运算符。 e.g。

text[i]= (text[i] - 'a' + key) % 26 + 'a';

答案 1 :(得分:2)

您需要使用模数运算符'%' 搜索“c ++ caesar cipher”的StackOverflow以获取此分配的更多示例。

示例:

new_letter = (old_letter - 'a'); // Set the range from 0 to 25.
new_letter = (new_letter + key) % 26; // 26 letters in the alphabet.
new_letter += 'a'; // Convert back to a letter.

答案 2 :(得分:2)

正如Giorgi所说,你的问题是溢出。您可以通过从不等式的两边减去key来避免它:

for (int i=0; text[i]; i++) {
    if (text[i] > 'z' - key) // check whether (text[i] + key) would be past `z`
        text[i] -= 26 - key;
    else
        text[i] += key;
}