跳过某些输入中的“if”语句

时间:2015-12-31 18:30:55

标签: c++ if-statement

所以我做了一个程序,以Julius Ceasar的方式加密输入(将所有字母添加为常数)。

该程序似乎工作正常,直到达到z + 6障碍,此时它开始关闭将使字母变为圆形的if语句。

我无法理解为什么它会在达到这一点时停止工作。

这是我的代码:

#include <iostream>
using namespace std;

char encoded(char c, int k) {
    k %= 26; //too big numbers!
    c += k; //encrypt
    if (c > 'z')
        c = c-'z'+ 'a' -1; //circular alphabet
    c = c - 'a' +'A'; //uppercase
    return c;
}

int main () {
    int k;
    while (cin >> k) {
        char c;
        while (cin >> c and c != '.') {
            if ('a' <= c and c <= 'z') 
                cout << encoded(c,k);
            else if (c == '_') 
                cout << ' ';
            else 
                cout << c;
        }
        cout << endl;
    }
}

如果有人能给我一些关于发生了什么的线索,我会非常感激。

2 个答案:

答案 0 :(得分:1)

您的问题写得不好。必须阅读整个代码,才能看到您仅针对az之间的字母调用该函数。

您似乎很怀疑将加密的字母转换为大写,但不会对已经为大写的字母进行加密。

检查main内部(停止条件除外)而不是encoded函数内部的范围是非常糟糕的设计。如果某个时候您意识到自己也应该转换大写字母,那么就必须同时修改mainencoded函数。

此外,它使函数encoded难以重用,因为在调用它之前,您总是需要做一堆if

这是您在encoded函数中应该执行的操作的伪代码:

  • 如果字母是小写字母,则先将其大写(这样输入中的大写字母也将被编码)。
  • 如果字母是大写字母,则进行适当的旋转(已经在其他答案和注释中进行了详细说明;您只需删除大写转换)。
  • 如果字母为_,请用空格替换
  • 否则,将按原样返回字符。
  • main函数中删除并在while语句块中进行测试。

出于可读性考虑,最好有一个make_upper函数,甚至还有一个rotate(char ch, int k)函数。

之所以我不提供代码,是因为它可能是一项家庭作业,您必须付出一些努力。

答案 1 :(得分:0)

代码中的问题是您遇到了溢出问题。数据类型char的范围可能从-128到127(取决于体系结构)。 &#39; z&#39;的ASCII码是122,所以122 + 6不是128,它是-128。

你可以解决它:

char encoded(char c, int k) {
    const int len = 'z'+1-'a';
    int ch = (int)c + k%len; //encrypt
    if (ch > 'z')
        ch = ch - len; //circular alphabet
    ch = ch - 'a' +'A'; //uppercase
    return (char)ch;
}

我更喜欢这个解决方案: 将您的角色转换为0到小于26的数字进行编码并将其转换回角色。

char encoded(char c, int k) {
    const int len = 'z'+1-'a';
    if ( c >= 'a' && c <= 'z' )
        c = (c-'a' + k) % len + 'A'; // + 'A' because of toupper ( +'a' keep lower)
    return c;
}