문자열이 @" ILL WILL KILLS "
이고 "ILL"이 발생할 때마다 NSScanner의 scanUpToString:intoString:
을 사용하고 있습니다. 정확한지 확인하려면 NSLog
4, 9 및 14가됩니다.NSScanner의 문자 ToBeSkipped의 이점은 무엇입니까?
문자열은 NSScanner의 기본값 인 charactersToBeSkipped
NSCharacterSet의 구성원 인 4 개의 공백으로 시작됩니다. 아래 예제와 같이 charactersToBeSkipped
을 nil
으로 설정하면이 코드는 "ILL"이 3 번 발생하는 것을 정확하게 찾습니다. 나는 기본 charactersToBeSkipped
을 무효화하지 않는 경우
NSScanner* scanner = [NSScanner scannerWithString:@" ILL WILL KILLS "] ;
scanner.charactersToBeSkipped = nil ;
NSString* scannedCharacters ;
while (TRUE) {
BOOL didScanUnignoredCharacters = [scanner scanUpToString:@"ILL" intoString:&scannedCharacters] ;
if (scanner.isAtEnd) {
break ;
}
NSLog(@"Found match at index: %tu", scanner.scanLocation) ;
// Since stopString "ILL" is 3 characters long, advance scanLocation by 3 to find the next "ILL".
scanner.scanLocation += 3 ;
}
그러나, 여기 무슨 일이야 :
scanner
는scanLocation == 0
초기화됩니다.scanUpToString
이 처음 실행되면 4 개의 빈 공간을 훑어보고ILL
의 인덱스 4에 "보게"되므로 즉시 중지됩니다.scanLocation
은 여전히 0
입니다.- 은 내가 일치하는 항목을 찾을 수 있다고 생각하고, 내가 3
scanUpToString
2 시간 동안 실행에 의해scanLocation
을 증가, 그것은 한 빈 공간 "과거를 보인다"인덱스 4에서ILL
"인식", 그래서 즉시 중지합니다.scanLocation
은 여전히 3
입니다. 나에게
은, 내가 그것을 scanLocation == 4
에서 멈출 것으로 예상하기 때문에 scanner
이 scanLocation == 0
에서 처음으로 중지 설계 결함입니다. 위의 코드가 NSLog
4, 9 및 14로 정확하게 다시 쓸 수 있다고 생각되는 경우 charactersToBeSkipped
에서 nil
으로 변경 한 다음 을으로 지정하십시오. 지금은 제 생각에 charactersToBeSkipped
은 NSScanners를 사용하기가 더 어렵게 만드는 것입니다.
당신은 'rangeOfString'이 아마도 특정 문자열을 검색 할 때 더 나은 도구 일 것입니다. 나는 이전에'scanInt'를 사용하지 않았지만, 어떻게 디폴트'charactersToBeSkipped'와 잘 동작하는지보고'nil'' charactersToBeSkipped'와는 작동하지 않습니다. –