对于一个字符串,先输出它的大写字母,再输出它的小写字母
错误做法:
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++;
}