字符操作爆了求助

P1914 小书童——凯撒密码

SUPERLWR @ 2022-07-31 09:45:48

#include<bits/stdc++.h>
using namespace std;
string s;
long long len,num;
char change(char c)
{
    char c1=c+num;
    if(c1>'z')
        c1-=26;
    return c1;
}
int main()
{
    cin>>num;
    num%=26;
    cin>>s;
    len=s.size(); 
    //cout<<len<<endl;
    for(int i=0;i<len;i++)
    {
        s[i]=change(s[i]);
        //cout<<i<<" "<<s[i]<<endl; 
    }
    cout<<s;
    return 0;
}

已经到入门题都要求助的地步了(悲

找不出错,感觉像是什么底层的概念有问题(或是我又sb了


by SUPERLWR @ 2022-07-31 09:48:14

4 WA

输入

25
abcxyz

答案

zabwxy

实际输出

zab憭

↑这什么原因?


by liangbowen @ 2022-07-31 09:52:38

@SUPERLWR 爆 ASCII 码范围了。调试语句:cout<<i<<" "<<(int)s[i]<<endl;

可以看到您输出了负数


by SUPERLWR @ 2022-07-31 09:54:32

@liangbowen 谢谢,原来还有这种东西


by liangbowen @ 2022-07-31 09:55:36

c1 的类型改为 int 应该就可以了


by SUPERLWR @ 2022-07-31 10:01:17

@liangbowen 还想问一句,是哪一步危险操作导致爆 ASCII 的呢


by liangbowen @ 2022-07-31 10:04:45

z 的 ASCII 码是 122,而 num 是 25,相加直接 147 了,但ASCII码范围只有 130 不到,所以崩了。

char c1=c+num;

by SUPERLWR @ 2022-07-31 10:05:07

@liangbowen 懂了谢谢


|