我正在尝试使用ascii值来检查字母的不同值来破译简单的Cesar密码。当程序试图在z之后检查一个字母时,我遇到了问题。我使用全部小写,所以如果字母在z上它应该再次移动到字母表的开头。我的代码如下
#include <iostream>
using namespace std;
#include <string>
#include <vector>
int main()
{
string unencr;
char temp;
cout << "Enter string:" << endl << endl;
cin >> unencr;
for(int i = 0; i<26; i++){
for(int j = 0; j < unencr.size(); j++){
temp = unencr[j];
if ((int)temp + i <= 122){
temp = (int)temp + i;
}
if ((int)temp + i > 122){
temp = (((int)temp +i) % 122)+96;
}
cout << temp;
}
cout << endl;
}
return 0;
}
答案 0 :(得分:0)
你的问题是你的if
声明中你说(((int)temp +i) % 122)+96;
但是如果char为155则会使它等于130.这超出了az的范围。
您要做的是:if(temp > 122)
然后您应该(temp-122)%122 + 97
而不是自己修改它。
答案 1 :(得分:0)
要更改单个字符c
,请使用以下行:
c = ((c - 'a' + 13) % 26) + 'a';
c - 'a' // convert to position in the alphabet, 0 based
c - 'a' + 13 // rot13 (or any other shift that you want)
(c - 'a' + 13) % 26 // wrap around after 'z'
((c - 'a' + 13) % 26) + 'a' // convert it to ASCII again
此外,您可能希望拥抱C ++的所有功能:
#include <iostream>
#include <string>
int main() {
// read a whole line instead of a single word:
std::string str;
std::getline(std::cin, str);
// iterate over the string, not over the letters of the alphabet:
for (char &c : str) {
if (('a' <= c) && (c <= 'z')) {
c = (((c + 13) - 'a') % 26) + 'a';
}
}
std::cout << str << std::endl;
return 0;
}