请帮我完成这个解译电文程序(C语言)

来源:百度知道 编辑:UC知道 时间:2024/05/31 17:20:39
一个字符数组,输入一行字母,然后让它们按照一个数字数组向后错位输出。
如输入:AncZy和26583
输出:CthHb
( A向后错两位输出C,n向后错6位输出t,c向后错5位输出h,Z向后错8位,仍要在大写字符之内,于是返回开头处输出H,y向后错3位,返回小写开头处输出b。)
main()
{char a[10],*pa;int b[10],*pb;
循环输入a[10]和b[10];
for(;*pa1='\0';pa++,pb++)
if(*pa>='a'&&*pa<='z')||(*pa>='A'&&*pa<='Z')
{*pa=*pa+*pb;
if(*pa>'Z'||*pa>'z') 到这里有问题了
通过for循环和if限制范围的嵌套来实现的话,比较困难的是:字母Z向后错8位后在ASCII码表中进入了小写字母的范围,但仍然在许可的范围之内,不能返回大写开头处重新开始。
请问各位怎样解决,用尽量简单的方法,请写出关键部分的代码,谢谢。

乱码的关键还是数据类型问题。char的值的范围(-128 ~ 127)

"字母Z向后错8位后在ASCII码表中进入了小写字母的范围"
pa=*pa+*pb;
if(*pa>'Z'||*pa>'z')
那是因为*pa的内容先被修改了,才做判断。当*pa原来是'Z'时,比如+9,就是99,进入了小写范围。这时你做判断if(*pa>'Z'||*pa>'z')就不对了。
先判断大小写,再分别对待,别嫌麻烦

我的代码
int main()
{
char s1[81];
char s2[81];

scanf("%s", s1);
scanf("%s", s2);

printf("\n");

unsigned char c1, c2; // 关键unsigned
for(int i=0; s1[i]!='\0' && s2[i]!='\0'; i++)
{
c1 = s1[i];
c2 = s2[i] - '0';

if(c1<'a') //大写字母(这里为了简单,默认都是英文字母)
{
c1 = s1[i] + c2;
if(c1>'Z')
c1 -= 26;
}
else //不是大写,那就是小写咯
{
c1 = s1[i] + c2;
if(c1>'z')
c1 -= 26;

}
s1[i] = c1;
}

printf("%s\n\n"