为什么我这有很大的bug?

P1914 小书童——凯撒密码

lzagddsg @ 2022-08-05 15:02:40

本人非牛牛牛,日常刷题刷到此题,尝试半天也无解。好不容易,写出代码,运行发现+-打错。改完bug,再次运行,发现输出许多emoji。
呈上代码,如下所示。恳请各位,看看哪里出错。

#include <bits/stdc++.h>

using namespace std;

int n;
char c[100];
int main()
{
    cin >> n >> c;
    for (int i = 0; i < sizeof(c); i++)
    {
        c[i] += n;
        if (c[i] > 122)
            c[i] -= 25;
        cout << c[i];
    }
    return 0;
}

输入完1(这里是换行符)qwe后,运行结果:rxf☺☺☺☺☺☺☺☺……(由于cmd版本太低(我电脑出bug了(是真的bug,虫子!)所以暂时借别人的用,我也不好意思截图保存然后上传img啊),无法复制,只好手打,由于太懒,又怕打多了,所以只好省略n个张嘴笑的表情包)
我真的求々你们,告诉我我哪里叒错了,好么?


by xutongwei @ 2022-08-05 15:25:48

@lzagddsg 其实这题 n 不会那么大的……

除了 sizeof 与 strlen 的问题,还有一个问题,就是 c[i] 很容易爆 char ,所以只要先 int zzz = c[i]; ,最后再 c[i] = zzz; 就可以了……


by lzagddsg @ 2022-08-05 15:26:26

@OoXiao_QioO 可以啊


by xutongwei @ 2022-08-05 15:27:25

对了,应该是 c[i] -= 26;

@OoXiao_QioO n 不会去那么大……一次就够了


by lzagddsg @ 2022-08-05 15:30:52

@xiaorui2007 感激不尽,现在代码

#include <bits/stdc++.h>

using namespace std;

int n;
char c[100];
int main()
{
    cin >> n >> c;
    for (int i = 0; i < strlen(c); i++)
    {
        c[i] += n;
        if (c[i] > 122)
            c[i] -= 25;
        cout << c[i];
    }
    return 0;
}

可惜没AC


by xutongwei @ 2022-08-05 15:41:42

@lzagddsg (没懂你的意思)

比如 'z',n=1 时,'z'+1=123,此时要变为 'a',所以要 -=26,123-26=97,没错啊……


by lzagddsg @ 2022-08-05 15:46:47

@xutongwei 刚刚手滑打错了,就当我没说哈


by lzagddsg @ 2022-08-05 15:47:21

@xiaorui2007 有道理!感激不尽感激不尽


by lzagddsg @ 2022-08-05 15:52:04

@xutongwei 但是似乎在-=25的时候,输入1(换行符)qwe(这是题干给的输入),输出的是rxf啊!当然,在-='z'+1-'a'的时候也是rxf。这就很奇妙了,'z'是122,'a'是97,理论上122+1-97就应该是26……(-=26的时候也是rxf


by lzagddsg @ 2022-08-05 15:56:55

@xiaorui2007 但似乎无论是

#include <bits/stdc++.h>

using namespace std;

int n;
char c[100];
int main()
{
    cin >> n >> c;
    for (int i = 0; i < strlen(c); i++)
    {
        c[i] += n;
        while (c[i] > 122)
            c[i] -= 25;
        cout << c[i];
    }
    return 0;
}

还是

#include <bits/stdc++.h>

using namespace std;

int n;
char c[100];
int main()
{
    cin >> n >> c;
    for (int i = 0; i < strlen(c); i++)
    {
        c[i] += n;
        while (c[i] > 122)
            c[i] -= 26;
        cout << c[i];
    }
    return 0;
}

在样例测试阶段都是rxf,而且最终提交的结果都是PAC并都是3和4错了


by xutongwei @ 2022-08-05 15:57:36

@lzagddsg (???)那是因为这组数据没有用到这个 if 啊


上一页 | 下一页