123456789qaz @ 2022-05-26 10:08:41
问一下各位大佬,这两个有什么区别?
为什么第一个过不了第二个能过?
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string a;
int n;
cin>>n;
cin>>a;
int l=a.length();
char x;
for(int i=0;i<l;i++){
x=a[i]+n;
if(x>'z'){
x=x-26;
}
cout<<x;
}
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string a;
int n;
cin>>n;
cin>>a;
int l=a.length();
char x;
for(int i=0;i<l;i++){
if(a[i]+n>'z'){
x=a[i]+n-26;
}
else{
x=a[i]+n;
}
cout<<x;
}
return 0;
}
by Bkorn_blume @ 2022-05-26 10:58:42
第一个里 如果移动位数超过Ascall码容量 就会使 x=a[i]+n;转化为未知字符 导致后续判断的转化x>'z'出现转化失败
但是第二个里a[i]+n>'z'直接是数值对比 解决了 x>'z'未知字符转数值的问题
by Bkorn_blume @ 2022-05-26 11:05:32
27 zz 晻 用1方法输入后得到晻 说明是Ascall越界了
by 123456789qaz @ 2022-05-26 11:16:47
@Yu_RenJay
也就是说ASCII码如果很大导致超过上限那么转化为数字就会失败,而第二种是直接比数字所以没有问题,我理解的对吗?
by Bkorn_blume @ 2022-05-26 14:38:32
@123456789qaz
有问题的程序:
x=a[i]+n;
if(x>'z'){
x=x-26;
}
如你所思考的
z的ascall转化为122
而基础ascall码转化最大值不超过126
所以要考虑越界(不然要爆的)
x=a[i]+n;
强行这样的话为变成繁体或者其他乱码
等下判断凯撒会失败
输出出来也是乱码
by 123456789qaz @ 2022-05-26 15:00:59
@Yu_RenJay
本蒟蒻幸得您的指点,已将此芝士收于囊中