(BOOL)strstr() 在 32 位 iOS 设备中失败
(BOOL)strstr() failed in a 32-bit iOS device
我用strstr判断是否包含字符串,然后用结果强转为BOOL类型,例如:
BOOL result = (BOOL)strstr(aString, "test");
当 aString 在 32 位 iOS 设备中包含 "test" 字符串时,有时会出现结果为 NO。但是 strstr(aString, "test") returns 地址正确。
根据架构,BOOL
可能 typedef
到 unsigned char
。那只是8位。当您将指针转换为 BOOL
时,您可能只从指针获取低 8 位。如果这些位全为 0,则 BOOL
为假,即使指针不是 NULL
(0).
换句话说,不要那样做。
如果您想要一个布尔值,请使用 strstr(aString, "test") != NULL
甚至 !!strstr(aString, "test")
。
来自 man strstr
:
RETURN VALUES:
If s2 is an empty string, s1 is returned; if s2 occurs nowhere in s1, NULL is returned; otherwise a pointer to the first
character of the first occurrence of s2 is returned.
所以将它转换为 bool
只是一个火车残骸,只有当 "test" 不在您的测试字符串中时它才为假,否则它会 return 一个指针,它在很多架构都大于 bool(我的系统显示 sizeof(bool)==1
),所以你会得到一个截断的答案......
所以你有一个场景,转换为 bool 意味着即使答案是的,你有 1/256 的机会它是 false
因为 bool
只有一个字节
错误地址示例:
- 0x80754300
- 0x12414700
- 0xac348700
- 等(任何以 0x00 结尾的东西)
我用strstr判断是否包含字符串,然后用结果强转为BOOL类型,例如:
BOOL result = (BOOL)strstr(aString, "test");
当 aString 在 32 位 iOS 设备中包含 "test" 字符串时,有时会出现结果为 NO。但是 strstr(aString, "test") returns 地址正确。
根据架构,BOOL
可能 typedef
到 unsigned char
。那只是8位。当您将指针转换为 BOOL
时,您可能只从指针获取低 8 位。如果这些位全为 0,则 BOOL
为假,即使指针不是 NULL
(0).
换句话说,不要那样做。
如果您想要一个布尔值,请使用 strstr(aString, "test") != NULL
甚至 !!strstr(aString, "test")
。
来自 man strstr
:
RETURN VALUES:
If s2 is an empty string, s1 is returned; if s2 occurs nowhere in s1, NULL is returned; otherwise a pointer to the first character of the first occurrence of s2 is returned.
所以将它转换为 bool
只是一个火车残骸,只有当 "test" 不在您的测试字符串中时它才为假,否则它会 return 一个指针,它在很多架构都大于 bool(我的系统显示 sizeof(bool)==1
),所以你会得到一个截断的答案......
所以你有一个场景,转换为 bool 意味着即使答案是的,你有 1/256 的机会它是 false
因为 bool
只有一个字节
错误地址示例:
- 0x80754300
- 0x12414700
- 0xac348700
- 等(任何以 0x00 结尾的东西)