2011-09-21 35 views
1

問題:如果你保存並使用memchr的返回值,在if中? 「if(ptr = memchr(str1,'4',sizeof(str1)))」?

if (ptr = memchr(str1, '4', sizeof(str1))) 
{ 
    // do stuff using ptr 
} 

,那麼你就進入,每一次做的「東西」。 但是,如果你只是做

if (memchr(str1, '4', sizeof(str1))) 
{ 
    // would do stuff but don't have ptr! 
} 

那麼你會進入,但你不會有指針到「4」是內部STR1。 我需要評估和做的東西了幾種可能性,即如果「4」,否則,如果「7」,否則,如果「1」等

那麼,什麼是最有效的方法,如果該字符都存在評估和使用返回的指針,如果它?當然這不是

if (memchr(str1, '4', sizeof(str1))) 
{ 
    ptr = memchr(str1, '4', sizeof(str1)) 
    // do stuff using ptr 
} 
+8

不,你的第一個陳述是不正確的。如果你執行'if(ptr = memchr(...)){}'如果字符沒有定位,你將不會進入if-block,因爲memchr()返回NULL值,假。 – Kusalananda

+2

請注意,如果'str1'是一個指針而不是數組,那麼'sizeof(str1)'不會做你期望的。 –

+0

在第一個選項中,它並不評估NULL,它是評估null到ptr的賦值,它將返回true,就像如果你寫了「if(ptr = 0)」或「if(ptr = 1)」一樣 - 分配成功完成並返回1. – paIncrease

回答

3

賦值運算符返回值被分配,這(連同右聯)就是a=b=c;作品。所以你的第一個例子會工作得很好。

2

做了memchr並指定返回值則做,如果。像這樣:

ptr = memchr(str1, '4', sizeof(str1)); 
if (ptr) 
{ 
    // do stuff using ptr; 
}
+0

儘管OP的「問題」根本不是問題,但我喜歡這個建議,因爲它避免了將賦值與比較混淆的可能性。 –