C语言凯撒密码pta 全部是字母是什么意思啊

img

img


#include<stdio.h>
int main()
{
int i,m=0,n;
char a[80];
for(i=0;i>=0;i++)
{
scanf("%c",&a[i]);
m=i+1;
if(a[i]=='\n')break;
}
scanf("%d",&n);
n=n%26;
for(i=0;i<m;i++)
{
if(a[i]>='a'&&a[i]<='z')
{
a[i]=a[i]+n;
if(a[i]<97)a[i]+=26;
if(a[i]>122)a[i]-=26;
}
if(a[i]>='A'&&a[i]<='Z')
{
a[i]=a[i]+n;
if(a[i]<65)a[i]+=26;
if(a[i]>90)a[i]-=26;
}
if(a[i]!='\n')printf("%c",a[i]);
}
return 0;
}

-

我也遇见了这个问题 之后我请教了一个大佬 先说问题 是在右移时 过大会导致超出ASCII最大值127 a[i]=a[i]+n 中 a[i]会编程乱码 而此时在if里比较的话 乱码没有与之对应的ASCII 就会打印出来乱码 eg z 6或比6大都会让z的移动打印出乱码 更深的原理就是 ASCII127 变-128 问题了 这个不太好说

先说问题点,题目说少于80个字符,应该是包含80个字符,那么算上换行,你数组长度应该是81,否则可能溢出
-=-=-=
代码很多地方可以优化
第一个for,既然循环次数不可预测,就别用for
用while(1)scanf("%c",&a[i++]);即可
可以在循环结束后写m=i-1,不要i每变一次都赋值给m,而且已经知道了最后一个里面存的是换行符,那么循环的时候不要带它
已经执行了n=n%26,可以保证n是正数,后面小于的判断完全是多余的,根本不可能越减越小
最后的if(a[i]!='\n')也是无效判断,已经用m限定了只打印有效字符,根本不可能出现\n