我这里有一个非常特殊的问题。我正在构建一个蜘蛛来抓取网页上的超链接并将它们放到一个表格中,我使用NSRanges
来解析HTML文档,但我遇到了一个问题。< / p>
我有以下代码行:
NSLog(@"%lu", [dataString rangeOfString:@"contents.asp?year1" options:0 range:NSMakeRange(index, dataString.length - index)].length);
这会将18
与日志相呼应,但是如果我把它放到一个布尔语句中,看看该长度是否大于-1:
NSLog(@"%d", ([dataString rangeOfString:@"contents.asp?year1" options:0 range:NSMakeRange(index, dataString.length - index)].length > -1));
这回应0或错误。 18显然大于-1,那么问题是什么?如果我将其切换到< -1
,则返回true。这是否与使用unsigned long进行类型转换有关?
答案 0 :(得分:4)
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
请注意,这两个字段都是NSUInteger
类型,是无符号类型。事实上,NSUInteger
是unsigned long
。
由于没有比unsigned long
更宽的整数类型,编译器会将-1
提升为无符号。我不记得这是否是未定义的行为,但在iOS和Mac OS X上,它具有将-1的补码位模式-1视为无符号整数的效果。该位模式作为无符号整数,是最大无符号整数值。
因此,你的比较永远不会成真。
如果您认为-1
表示&#34;未找到&#34;,那您就错了。检查rangeOfString:options:range:
是否找不到目标的正确方法是检查返回范围的location
是否为NSNotFound
:
NSUInteger location = [dataString rangeOfString:@"contents.asp?year1"
options:0 range:NSMakeRange(index, dataString.length - index)].location
BOOL foundIt = location != NSNotFound;