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 0xd532 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 変数をの範囲よりもMYSTRING1 つ多く設定します。これが、そのエラーが発生する理由です。これを修正するには、次のようにします。

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 に答える