这是一个简单的代码,但我无法理解一个奇怪的事件。 代码:
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;”
答案 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;
}