【问题标题】:substringWithRange out of bounds--what am I missing?substringWithRange 越界——我错过了什么?
【发布时间】:2014-06-27 23:14:12
【问题描述】:

我正在尝试从某些代码中提取一些字符串,但遇到了 NSRangeException 我不明白的问题。这是我的代码:

NSString *start = @"<strong><span class='target'>";
NSString *end = @"</span></strong> ";

NSRange startRange = [stringToScan rangeOfString:start];
NSRange endRange = [stringToScan rangeOfString:end];
NSRange targetRange;
targetRange.length = endRange.location - startRange.location - startRange.length;
targetRange.location = startRange.location + startRange.length;
NSString *adlerNumber = [stringToScan substringWithRange:targetRange];
NSLog(@"%@",adlerNumber);

NSString *startHeadword = @"Translated headword: </strong>";
NSString *endHeadword = @"<strong class=";

NSRange startRangeHeadword = [stringToScan rangeOfString:startHeadword]; //logs as e.g. location 773, length 29
NSRange endRangeHeadword = [stringToScan rangeOfString:endHeadword]; //logs as e.g. location 809
NSRange targetRangeHeadword;
targetRangeHeadword.length = endRangeHeadword.location - startRangeHeadword.location - startRangeHeadword.length; //logs as e.g. 27
targetRangeHeadword.location = startRangeHeadword.location + startRangeHeadword.length; // logs as e.g. 2496
NSString *translatedHeadword = [stringToScan substringWithRange:targetRangeHeadword];

adlerNumber 已创建并无错误地记录。但是随后尝试创建translatedHeadword(上面的最后一行代码)给了我这个错误:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range {2634, 2147481013} out of bounds; string length 9309'

如果 targetRangeHeadword.length 记录为 27,targetRangeHeadword.location 记录为 2496,我如何获得 NSRangeException 给我的数字?我该如何解决这个问题?

提前感谢您的帮助,伙计们。

【问题讨论】:

  • 另外,请确保:class='target' 实际上并未阅读:class="target"。对于NSString(' != ")

标签: ios objective-c nsrange nsrangeexception


【解决方案1】:

添加一些NSLogs 以查看更多数字,例如stringToScan.length

"如果 targetRangeHeadword.length 记录为 27,targetRangeHeadword.location 记录为 2496,我如何获得 NSRangeException 的数字"

尝试将targetRangeHeadword.location 替换为诸如2400 之类的幻数和NSLog 它。难道2496就是stringToScan的结尾?

-编辑:我刚刚注意到:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range {2634, 2147481013} out of bounds; string length 9309'

特别是Range {2634, 2147481013},表示您的结束标签之一&lt;/&gt; 未找到。

这个数字“2147481013”表示没有找到东西。

【讨论】:

  • 非常感谢 - 我经历并繁琐地记录了所有内容,这告诉我错误在哪里!
【解决方案2】:

我会考虑在这里使用 NSRegularExpressions 和 rangeOfString 方法。这样,您可以获取特定模式的所有实例,并用您想要的任何内容替换它们或提取它们。练习这些的好网站是:www.regexr.com

【讨论】:

    【解决方案3】:

    startRangeHeadword 未找到,它是 locationNSNotFound 或者可能是另一个搜索返回了 NSNotFound。在任何搜索 (rangeOfString) 之后,您必须检查 NSRange 位置是否不是 NSNotFound。错误检查很痛苦,但确实必须这样做。

    单步执行您的代码并观察locationNSNotFound 的范围(一个很大的数字)。

    作为替代方案,请考虑 NSScanner,它可能更适合您的需求。

    【讨论】:

    • 谢谢——但在我发布此之前,我单步执行了代码,并且所有范围都记录了位置——我想我在上面的代码中注释了位置是什么。 :( 但我会去看看 NSScanner。
    • 当你得到一个像 2147481013 这样的位置或范围时,就会出现问题,通常是由于 NSNotFound 在 32 位系统上是 2147483647。无论如何,长度为 2147481013 很可能是一个错误,找到那是从哪里来的。
    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多