Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的错误字符';s加密(ascii)_C++_Encryption_Ascii - Fatal编程技术网

C++ 奇怪的错误字符';s加密(ascii)

C++ 奇怪的错误字符';s加密(ascii),c++,encryption,ascii,C++,Encryption,Ascii,这是一个简单的代码,但我不能理解一个奇怪的事件。 代码: void Crittografia::CifraTesto(字符文本[]){ int i; 对于(i=0;i'z'){ text[i]=text[i]-26; } } } 函数接收此处输入的字符串: . 在本例中,它使用5'键“y”在“d”中的更改正确 但在这种情况下:。 当键为7时,它会改变'ch'中的'y'而不是正确的'f',因此显然不会执行该行:“text[i]=text[i]-26 text[i]=text[i]+键 当键为7且

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

void Crittografia::CifraTesto(字符文本[]){
int i;
对于(i=0;i'z'){
text[i]=text[i]-26;
}
}
}
函数接收此处输入的字符串: .
在本例中,它使用5'键“y”在“d”中的更改正确

但在这种情况下:。
当键为7时,它会改变'ch'中的'y'而不是正确的'f',因此显然不会执行该行:“text[i]=text[i]-26

text[i]=text[i]+键

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

在加法中最好使用模运算符。e、 g

text[i]= (text[i] - 'a' + key) % 26 + 'a';
您需要使用模数运算符“%”。
在StackOverflow中搜索“c++caesar cipher”以获取此赋值的更多示例

例如:

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.

正如Giorgi所说,您的问题在于溢出。您可以通过从不等式的两侧减去
键来避免它:

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;
}

您需要学习如何从控制台窗口复制文本。在Windows操作系统上,右键单击标题栏,选择编辑->标记。用鼠标高亮显示要复制的区域,然后按Enter键。这将把突出显示的文本放在剪贴板上,以便粘贴到你的问题中。这可能是一个好的开始。然后,您可能知道为什么例如
somecharacterteer-26
可能不是一个好主意。C中没有
,所以您的问题也不是
C
。模数是有用的,但不是必需的。此外,我们可以不使用
%
@BenVoigt计算模,但我们都使用模,OP将在其他人的代码中看到它。
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;
}