2012-06-21 38 views
7

Được rồi, vì vậy đây là một chút khó hiểu (tốt với tôi). Tôi có một chuỗi có một số duy nhất tôi muốn ra khỏi nó. Tôi đã bao quanh số này với '/' để tôi có thể lấy số đó ra sau đó.Chuỗi con có phạm vi vượt quá giới hạn?

Dưới đây là cách tôi đang nhận được số ra khỏi nó:

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]; 
     } 

Nó giữ đâm và giao diện điều khiển nói:

* Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSRangeException', lý do : '- [__ NSCFString substringWithRange:]: Dải hoặc chỉ số nằm ngoài giới hạn' gọi * ném Đầu tiên stack: (0x1875d72 0x106ce51 0x1875b4b 0x184ea64 0x3a6c 0x1080713 0x1bf59 0x1bef1 0xd532e 0xd588c 0xd49f5 0x49a2f 0x49c42 0x290fe 0x1b3fd 0x17d2f39 0x17d2c10 0x17ebda5 0x17ebb12 0x181cb46 0x181bed4 0x181bdab 0x17d1923 0x17d17a8 0x18e71 0x200d 0x1f35) libC++ abi.dylib: chấm dứt gọi là ném một ngoại lệ

Từ tôi đếm phạm vi là trong phạm vi, tôi không nhận được lý do tại sao tôi nhận được lỗi này?

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn

+0

ai đó khác có thể sẽ trả lời câu hỏi của bạn khá nhanh, nhưng một điều tôi muốn chỉ ra a.s.a.p. đã được * không bao giờ * sử dụng tất cả các mũ (hoặc viết hoa) tên của một biến, như "MYSTRING'". Tất cả các mũ có thể thích hợp cho các hằng số, nhưng một kiểu ưu tiên khác là tiền tố một Konstant với một K (hoặc chữ thường k). –

+0

Oh tôi chỉ làm điều đó vì vậy nó là đáng chú ý cho bạn guys :), nó không giống như trong mã – Jacob

Trả lời

24

NSMakeRange của bạn (bắt đầu, kết thúc) nên là NSMakeRange (bắt đầu, kết thúc);

+0

Đã làm việc !! Cảm ơn – Jacob

2

Tôi không biết lý do tại sao bạn đang sử dụng phương pháp này, nhưng iOS cung cấp một chức năng chuỗi mà tách một chuỗi liên quan đến một chuỗi khác và trả về một mảng của các thành phần. Xem ví dụ sau:

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

Chuỗi chuỗi thành phần của bạn phải có 2 cửa hàng trong đó.

+0

Tôi không bao giờ biết có một chức năng như vậy, bạn có thể cung cấp một chút mã tương đối với ví dụ của tôi để giúp tôi hiểu chính xác như thế nào chức năng đó hoạt động? Cảm ơn câu trả lời – Jacob

1

Khi trình biên dịch chạy vào mã này ...

else{ 
    end = i + 1; 
} 

... trong phiên cuối cùng của vòng lặp, nó đặt biến dấu chấm hết cho một hơn sau đó phạm vi của MYSTRING. Đây là lý do tại sao bạn nhận được lỗi đó. Để khắc phục sự cố, chỉ cần thực hiện việc này:

else{ 
    end = i; 
} 

Hy vọng điều này sẽ hữu ích!

P.S. Cách tiếp cận Saleh là một cách đơn giản của việc hoàn thành những gì bạn muốn

------ CẬP NHẬT ------

Bạn nên làm điều đó như thực sự này:

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

tôi vẫn còn lỗi khi làm điều đó:/ – Jacob

6

Tôi nghĩ bạn có nhầm lẫn về cú pháp của NSMakeRange. Nó là một cái gì đó như thế này

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

<#NSUInteger loc#>: Đây là vị trí từ nơi bạn muốn bắt đầu hái hoặc chuỗi.

<#NSUInteger len#>: Đây là độ dài đầu ra hoặc chuỗi con của bạn.

Ví dụ:

Mytest12test

Bây giờ tôi muốn pick'12'

vậy:

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

Trong mã của bạn thay vì chiều dài bạn đang đi qua chỉ số của nhân vật cuối đó là sai lầm của bạn.

+0

Ồ, điều đó có ý nghĩa hơn – Jacob

+0

NSMakeRange (<# NSUInteger loC#>, <#NSUInteger len #>) điều này đã thực hiện rất rõ ràng – Jasmeet

Các vấn đề liên quan