2012-06-21 10 views
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:私は範囲をカウントから例外

を投げると呼ばれる終了した範囲内である、私はなぜ私を取得いけませんこのエラーが発生していますか?

ご協力いただければ幸いです。

おかげ

+0

誰かがあなたの質問にかなり素早く答えるつもりですが、私はa.s.a.p.を指摘したいと思いました。 「MYSTRING」のように、変数の名前をすべて大文字(または大文字)にすることは決して*決して*していませんでした。すべての大文字は定数に適しているかもしれませんが、もう一つの好ましいスタイルはKonstantにK(または小文字のk)を付けることです。 –

+0

ああ私はそれだけでそれはあなたの人のために気付いているので、そのコードのようではない – Jacob

答えて

24

あなたNSMakeRange( start、end)はNSMakeRange(start、end-start)でなければなりません。

+0

働いた!ありがとう – Jacob

2

あなたがこのアプローチを使用している理由を私は知らないが、iOSのは、別の文字列に対する文字列を分離し、コンポーネントの配列を返す文字列関数を提供します。次の例を参照してください:

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

今すぐあなたのコンポーネントの文字列はそれに2店舗を持つ必要があります。ループの最後の繰り返しで

+0

私はそのような関数があったことを知らなかった、おそらく私の例に相対的なコードのビットを提供することができますか?その機能は機能しますか?回答をありがとう – Jacob

1

コンパイラは、このコードに実行されます...

else{ 
    end = i + 1; 
} 

...、それは、1つ以上MYSTRINGの範囲に終止符変数を設定します。これが原因で、そのエラーが発生しています。これを修正するには、次のようにしてください:

else{ 
    end = i; 
} 

P.S.サレーのアプローチはUPDATE ------あなたが

欲しいものを達成するための簡単な方法である------

あなたが実際にこのようにそれを行う必要があります。

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])]; 
+0

私はまだそれを行うときにエラー:/ – Jacob

6

あなたはNSMakeRangeの構文に混乱があると思います。それはそれはあなたが選ぶまたは部分を開始する場所から場所です。この

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

<#NSUInteger loc#>:のようなものです。

<#NSUInteger len#>:これは出力または部分文字列の長さです。

例:

Mytest12test

今、私はそう

をpick'12' したい:あなたのコードの代わりに、長さが

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

あなたが最後の文字のインデックスを渡していますそれはあなたの間違いです。

+0

ああ、それはより意味をなさない – Jacob

+0

NSMakeRange(<#NSUInteger loc#>、<#NSUInteger len#>)これははっきりした – Jasmeet

関連する問題