2011-09-21 36 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的“问题”根本不是问题,但我喜欢这个建议,因为它避免了将赋值与比较混淆的可能性。 –