Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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++ 跳过;如果;某些输入中的语句_C++_If Statement - Fatal编程技术网

C++ 跳过;如果;某些输入中的语句

C++ 跳过;如果;某些输入中的语句,c++,if-statement,C++,If Statement,因此,我做了一个程序,以朱利叶斯·凯萨(Julius Cesar)的方式对输入进行加密(给所有字母加上一个常量) 该程序似乎工作正常,直到它达到z+6的障碍,在这一点上,它开始关闭将使字母表循环的if语句 我只是不明白为什么当它达到那个点时会停止工作 这是我的代码: #include <iostream> using namespace std; char encoded(char c, int k) { k %= 26; //too big numbers! c

因此,我做了一个程序,以朱利叶斯·凯萨(Julius Cesar)的方式对输入进行加密(给所有字母加上一个常量)

该程序似乎工作正常,直到它达到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;
    }
}
#包括
使用名称空间std;
字符编码(字符c,整数k){
k%=26;//数字太大了!
c+=k;//加密
如果(c>‘z’)
c=c-'z'+'a'-1;//循环字母表
c=c-'a'+'a';//大写
返回c;
}
int main(){
int k;
而(cin>>k){
字符c;
而(cin>>c和c!='。){

如果('a'代码中的问题是溢出。数据类型
char
可能在-128到127之间(取决于体系结构)。ASCII代码'z'是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;
}
char编码(char c,int k){
常数int len='z'+1-'a';

如果(c>='a'&&c您的问题写得很糟糕。您必须阅读整个代码,才能看到您仅针对
a
z
之间的字母调用该函数

您可能会将加密的字母转换为大写,但不会对已经是大写的字母进行加密,这似乎非常可疑

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

此外,它使函数
encoded
很难重用,因为在调用它之前,您总是需要执行一系列
if

这是一个伪代码,用于说明在
encoded
函数中应该执行的操作:

  • 若字母是小写的,那个么先将其改为大写(这样输入中的大写字母也会被编码)
  • 如果字母是大写字母,则适当地进行旋转(已在其他答案和注释中详细解释;您只需删除大写转换)
  • 如果字母是
    \u
    ,则将其替换为空格
  • 否则,将按原样返回字符
  • main
    函数中删除,并在
    while
    语句块中进行测试
为了便于阅读,最好使用
make_upper
函数,甚至可以使用
rotate(char ch,int k)
函数


其中一个原因,我不提供代码是因为它可能是一个家庭作业,您必须在其中付出一些努力。

请更具体地说明“达到
z+6
障碍”的含义。具体来说,输入、预期输出和实际输出是什么?这可能是一个溢出问题。请尝试使用
无符号字符
。尝试查看大写和小写字母的ASCII编码。然后在纸上跟踪代码中的一些值。小写字母末尾的值(如“z”)接近(有符号)char变量中可以保存的最大值。我怀疑
c+=k
可能溢出。您应该使用调试器,一次执行一条语句。观察变量中的值,以验证它们是否在范围内且正确。