(BOOL)strstr()在32位iOS设备中失败
我使用strstr确定是否包含字符串,然后将结果强用于BOOL类型,例如:(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
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结尾的任何内容)
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
。定义在
中。