1. 程式人生 > >while迴圈與if條件判斷

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

}