用ascii值改变字母

时间:2014-09-17 02:14:54

标签: c++

我正在尝试使用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;
}

2 个答案:

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