7

好的,所以这有点令人困惑(对我来说很好)。我有一个字符串,其中包含一个我想要的数字。我用“/”包围了这个数字,以便以后可以从中取出这个数字。

这是我从中获取数字的方法:

if ([MYSTRING hasSuffix:@"mp"]) {
        int start = 0;
        int end = 0;
        char looking = '/';
        for(int i=0; i < MYSTRING.length; i++){
            if (looking == [MYSTRING characterAtIndex:i]) {
                if (start == 0) {
                    start = i;
                }
                else{
                    end = i + 1;
                }
            }
        }
        NSLog(@"%@", MYSTRING); //When i NSLOG here i get '2012-06-21 03:58:00 +0000/1/mp', 1 is the number i want out of the string, but this number could also change to 55 or whatever the user has
        NSLog(@"start: %i, end: %i", start, end); //When i NSLOG here i get 'start: 25, end: 28'
        NSString *number = [MYSTRING substringWithRange:NSMakeRange(start, end)];
        number = [number stringByReplacingOccurrencesOfString:@"/" withString:@""];
        if ([number intValue] > numberInt) {
            numberInt = [number intValue];
        }

它不断崩溃,控制台说:

*终止应用程序由于未捕获的异常'NSRangeException',原因是: ' - [__ NSCFString substringWithRange:]:范围或索引越界' *第一掷调用堆栈:(0x1875d72 0x106ce51 0x1875b4b 0x184ea64 0x3a6c 0x1080713 0x1bf59 0x1bef1 0xd532e 0xd588c 0xd49f5 0x49a2f 0x49c42 0x290fe 0x1b3fd 0x17d2f39 0x17d2c10 0x17ebda5 0x17ebb12 0x181cb46 0x181bed4 0x181bdab 0x17d1923 0x17d17a​​8 0x18e71 0x200d 0x1f35)libc++abi.dylib:终止调用抛出异常

从我的计数范围内,我不明白为什么我会收到这个错误?

任何帮助,将不胜感激。

谢谢

4

4 回答 4

25

你的 NSMakeRange(start, end) 应该是 NSMakeRange(start, end- start);

于 2012-06-21T04:45:10.863 回答
7

我认为您对 NSMakeRange 的语法感到困惑。是这样的

NSMakeRange(<#NSUInteger loc#>, <#NSUInteger len#>)

<#NSUInteger loc#>:它是您要开始挑选或子串的位置。

<#NSUInteger len#>:这是您的输出或子字符串的长度。

例子:

mytest12test

现在我想选择'12'

所以:

NSString *t=@"Mytest12test";
NSString *x=[t substringWithRange:NSMakeRange(6, 2)] ;

在您的代码而不是长度中,您传递的是错误的结束字符索引。

于 2012-06-21T04:46:38.383 回答
2

我不知道您为什么使用这种方法,但 iOS 提供了一个字符串函数,该函数将一个字符串与另一个字符串分开并返回一个组件数组。请参见以下示例:

NSString * str = @"dadsada/2/dsadsa";
NSArray *listItems = [str componentsSeparatedByString:@"/"];
NSString *component = [listItems objectAtIndex:1];

现在你的组件字符串应该有 2 个存储。

于 2012-06-21T04:35:35.627 回答
1

当编译器遇到此代码时...

else{   
    end = i + 1;
}

...在循环的最后一次迭代中,它将 end 变量设置MYSTRING. 这就是您收到该错误的原因。要修复它,只需执行以下操作:

else{   
    end = i;
}

希望这可以帮助!

PS Saleh 的方法是实现您想要的更简单的方法

- - - 更新 - - -

你实际上应该这样做:

NSMutableArray *occurencesOfSlashes = [[NSMutableArray alloc] init];
char looking = '/';
for(int i=0; i < MYSTRING.length; i++){
if ([MYSTRING characterAtIndex:i] == looking) {
    [occurencesOfSlashes addObject:[NSNumber numberWithInt:i]];  
}
NSString *finalString = [MYSTRING substringWithRange:NSMakeRange([occurencesOfSlashes objectAtIndex:0],[occurencesOfSlashes objectAtIndex:1])];
于 2012-06-21T04:41:31.087 回答