(BOOL)strstr()在32位iOS设备中失败

(BOOL)strstr()在32位iOS设备中失败,ios,objective-c,xcode6,32-bit,Ios,Objective C,Xcode6,32 Bit,我使用strstr确定是否包含字符串,然后将结果强用于BOOL类型,例如: BOOL result = (BOOL)strstr(aString, "test"); 当aString在32位iOS设备中包含“test”字符串时,有时会出现结果为否。但是strstr(aString,“test”)会正确返回地址。取决于架构,BOOL可能是typedef'd到无符号字符。只有8位。当您将指针投射到BOOL时,您可能只从指针中获得低8位。如果这些位都为0,则即使指针不是NULL(0),布尔值也为fa

我使用strstr确定是否包含字符串,然后将结果强用于BOOL类型,例如:

BOOL result = (BOOL)strstr(aString, "test");

当aString在32位iOS设备中包含“test”字符串时,有时会出现结果为否。但是strstr(aString,“test”)会正确返回地址。

取决于架构,
BOOL
可能是
typedef
'd到
无符号字符。只有8位。当您将指针投射到
BOOL
时,您可能只从指针中获得低8位。如果这些位都为0,则即使指针不是
NULL
(0),布尔值也为false

换句话说,不要那样做


如果需要布尔值,请使用
strstr(aString,“test”)!=空
甚至
!!strstr(aString,“test”)
来自man strstr

返回值:
如果s2为空字符串,则返回s1;如果s2在s1中没有出现,则返回NULL;否则,将创建指向第一个 返回s2第一次出现的字符

因此,将其转换为一个
bool
只是一个火车失事,只有当“test”不在您的测试字符串中时才是错误的,否则它将返回一个指针,在许多体系结构中该指针大于bool(我的系统显示
sizeof(bool)==1
),因此您将得到一个截断的答案
因此,在一个场景中,转换为bool意味着,即使答案是肯定的,也有1/256的几率为
false
,因为
bool
只有一个字节

可能为假的示例地址:

  • 0x80754300
  • 0x12414700
  • 0xac348700
  • 等(以0x00结尾的任何内容)

实际上,C99的
bool
(也称为
\u bool
)将安全地将所有非零值转换为1。在Objective-C的
BOOL
typedef
'd到
BOOL
的体系结构上,Fly的构造是安全的。@Kenthomass,你当然是对的,我已经测试过了,我不知道32位iOS BOOL是否被键入了\u BOOL,但在32位Mac OS X上,它不是…。
BOOL
仅在64位iOS上定义为
BOOL
。定义在
中。