while循环与if条件判断

对于一个字符串,先输出它的大写字母,再输出它的小写字母

错误做法:

char a[]="hElASFGoo";

char* p;
char* q;
char c;
p=a;
while(*p)
{
if(*p>=65&&*p<=90)
{   
*k++=*p++; 
}

错误原因:因为判断小写字母的循环与判断大写字母的循环是同一个,所以,比如:当第二个字母是E时,进入下一个if中执行下一个表达式,也就是此时k中在存入了第一个小写字母之后,存入了大写字母,输出的时候,大小写字母仍然没有分开。应该是进行两遍循环,所以应该设两个while.
if(*p>=97&&*p<=122)
{
*k++=*p++;
}
printf("%c",*k);
}
return 0;
}

如果是改成:

char a[]="hElASFGoo";

char* p;
char* q;
char *k;
p=a;
while(*p)
{
if(*p>=65&&*p<=90)
{   
*k++=*p++; 
}

}

如果是这样的话,执行完if语句,*k=*p;k=k+1;p=p+1。执行完这一步之后,将地址p里的值送到k里,此时k=k+1,p=p+1;因为这是一个while循环,在满足*P不为0时,会一直执行。但是当第二个字母不是小写字母时,不执行if里的条件语句,所以此时在不执行if语句之后,又返回while语句,但是里面的p还是上一个地址,没有办法接着去判断。当输入小写字母时,p不会增加,陷入死循环。所以,p++不应该放在if条件语句中执行。在所有的希望一个循环可以遍历所有的值时,在使用while加上if时,a++之类的都不能放在if条件语句判断里面。

可以改成:

char a[]="hElASFGoo";

char* p;
char* q;
char *k;
p=a;
while(*p)
{
if(*p>=65&&*p<=90)
{   
*k=*p; 
}

k++;

p++;

}

下面也进行更改

while(*p)

{

if(*p>=97&&*p<=122)

{
*k=*p;
}

p++;

k++;
printf("%c",*k);

这里是当输入最后一个字符时,无论是不是执行if条件语句中的内容,k=k+1;此时虽然进入while循环,但是不执行if语句,因为k此时指向的地址里面存放的是‘\0’,此时p继续加1,这时结束循环。*k=‘\0’,所以这里肯定不能输出*k。


并且这也出现了一个错误,此时*k里面存放的是只有一个值,想要将*k里面的所有值都输出来,不能只输出*k,这是一个值,应该输出整个字符串。
}
return 0;
}


这样改完之后,上面的程序还有一个错误

char a[]="hElASFGoo";

char* p;

char* q;
char *k;
p=a;
while(*p)
{
if(*p>=65&&*p<=90)
{   
*k=*p; 
}

k++;

p++;

}

此时当字符为小写字母时,虽然不进入if条件判断,但是*k指针仍然在移动,*k指针在移动,但是字符串的内容却没有赋值进去,所以*k里面还是一开始赋值的0,所以,逻辑应设为只有在if循环语句中才有k++。应该改为:

while(*p)
{
if(*p>=65&&*p<=90)
{   
*k++=*p; 
}

p++;

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值