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++;
}