一个简单的题

来源:百度知道 编辑:UC知道 时间:2024/06/11 03:20:12
编写一个函数,要求:字母则变成后面的字母,zZ成为aA,其他字符不变
例如:原字符Mn 123Zxy
后来的字符No 123Ayz
void chg(char *s)
{
while(*(s++))
{
if(*s>='a'&&*s<'z'||*s>='A'&&*s<'Z')
(*s)++;
if(*s=='z'||*s=='Z')
*s=*s-25;
}
}
我写的函数哪里错了?
*(s++)是在向后一动一个指针啊,不是(*s)++

改成while(*s)
{
...

s++;
}

我知道是向后移动指针啊
但是你while(*(s++))了以后,进入循环体内部时s已经向后移动一个了,相当于你判断第k个字符不为0,但实际上处理的是第k+1个字符了

所以你要在处理完*s后,再在最后把s向后移

void chg(char *s)
{
while(*(s++))
{
if(*s=='z'||*s=='Z')
*s=*s-25;
else
if(*s>='a'&&*s<'z'||*s>='A'&&*s<'Z')
(*s)++;
}
}

因为程序在执行if(*s=='z'||*s=='Z')之前已经(*s)++了,假设输入的是一个y,
执行(*s)++就变成了z,然后又要被转化为a,自然出错,若输入为z,则转化为了{

void chg(char *s)
{
while(*s)
{
if(*s>='a'&&*s<'z'||*s>='A'&&*s<'Z')
(*s)++;
else if(*s=='z'||*s=='Z') /* 一定要加上else */
*s=*s-25;
s++;
}
}