2012-04-02 5 views
0

배열을 살펴보고 검색 한 단어의 색인을 찾습니다. 그 정보를 사용하여 다음 단어에 도달 할 때까지 단어 사이에 공백을 넣습니다. 그 텍스트를 저장하고 변수에 저장합니다.문자열 끝에 여분의 공간이 있습니다.

나는 lastObject와 arr objectAtIndex 사이의 내 비교가 의심 스럽습니다. 저는 작동하지 않지만 왜 그럴 수없는 것 같습니까?

NSArray * arr;

NSScanner *scanner = [NSScanner scannerWithString:_exerciseDocument]; 

while(![scanner isAtEnd]) 
{ 
    NSString *buffer; 
    if([scanner scanCharactersFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] intoString:&buffer]) 
     { 
      [scanner scanUpToString:" " intoString:&buffer];   
      [scanner scanString:@" " intoString:nil]; 
     } 
    else 
     { 

     } 

for(int i=0; i <arr.count; i++) 
{ 
    NSString *stringToCheck = (NSString *)[arr objectAtIndex:i]; 
    if([stringToCheck isEqualToString:@"Fokus:"]) 
    { 
     _descriptionIndex = i; 
    } 
    if([stringToCheck isEqualToString:@"Niveau:"]) 
    { 
     _focusIndex = i; 
    } 
    if([stringToCheck isEqualToString:@"Redskab:"]) 
    { 
     _niveauIndex = i; 
    } 
    if([stringToCheck isEqualToString:@"Vanddybde:"]) 
    { 
     _equipmentIndex = i; 
    } 
} 

_descriptiontToTextField = [[NSString alloc]init]; 
for(int i=1; i <_descriptionIndex; i++) 
{ 
    if(![[arr lastObject] isEqual:[arr objectAtIndex:i]]) 
    { 
     _descriptiontToTextField = [_descriptiontToTextField stringByAppendingString:[ arr objectAtIndex:i]]; 
     _descriptiontToTextField = [_descriptiontToTextField stringByAppendingString:@" "]; 
    } 
    else 
    { 
     _descriptiontToTextField = [_descriptiontToTextField stringByAppendingString:[ arr objectAtIndex:i]]; 
    } 
} 
+0

예상되는 입출력의 몇 가지 예를 제공 할 수 있습니까? – fbernardo

답변

1

에게 먼저 비교 isEqualToString를 사용하는 경우, -[NSString componentsSeparatedByCharactersInSet:]은 생각하는대로 작동하지 않습니다. _exerciseDocument에 단어 사이에 공백이 여러 개인 경우 arr에 빈 문자열이 많이 생길 수 있습니다. 이는 원하는 내용이 아닙니다. NSScanner (기본적으로 공백 문자와 줄 바꿈 문자는 건너 뜁니다)을 사용하여 배열을 작성하는 것이 좋습니다.

둘째, arr에는 문자열이 포함되며 다른 종류의 개체는 포함되지 않습니다. 이 점을 감안할 때 비교를 위해 -[NSString isEqualToString:]을 사용해야합니다.

셋째, 인덱스 0 대신 인덱스 1에서 두 번째 루프를 시작하는 이유가 무엇입니까?

+0

내가 읽는 텍스트 문서에는 각 단어 사이에 하나 이상의 공백이 포함되지 않으므로 문제가 될 수는 없지만 NSScanner로 어떻게 구현할 것인지 궁금합니다. 나는 파일의 첫 번째 단어를 문자열에 넣고 싶지 않기 때문에 색인 1부터 시작합니다. –

+0

@ NielsSønderbæk : _exerciseDocument 문자열을 사용하여 스캐너를 설정하고 맨 앞과 맨 뒤에있는 공백을 먼저 제거합니다. 조건으로 (! ​​[scanner isAtEnd]) while 루프를 구현할 것입니다. 루프 내부에서 먼저 스캐너를 사용하여 + [NSCharacterSet whitespaceAndNewlineCharacterSet]의 문자까지 스캔하여 참조로 문자열을 가져옵니다. 그런 다음 공백 문자와 개행 문자를 검사하여 문자열 참조에 NULL을 전달합니다. 문자에 신경 쓰지 않기 때문입니다. 문자열을 읽을 때 변경할 수있는 배열에 문자열을 추가합니다. – trudyscousin

+0

@ NielsSønderbæk : 단어 사이에 여러 공백을 처리 할 수있는 유일한 이점이 있습니다 (지적한대로 문제가되지 않음). 그러나 단 하나의 공간 만 의지 할 수 없다면 정말 잘 작동합니다. – trudyscousin

1

경우 문 귀하가 루프 항상 배열의 마지막 개체에 도달하기 전에 종료하기 때문에 결코 YES로 결과 없음 : 내가 < _descriptionIndex합니다. *

1

난 당신이 배열 기계가 모든 객체와 배열의 마지막 개체를 비교하려는 생각하지만, ISEQUAL은 두 개체가 개체에없는 값을 입력 당신이

있는 NSArray를 볼 수있는, 비교하는 데 사용됩니다 arr = [_exerciseDocument componentsSeparatedByCharactersInSet : [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 이러한 문자열의 배열로 도착을 만들 것이다

모든 객체 타입을 의미 [있는 NSString 클래스]

경우 ([도착 lastObject] ISEQUAL [도착 objectAtIndex : I]!)

모든 개체가 동일한 유형이기 때문에 코드 때문에 부정의 다른 부분에서 실행됩니다 있도록 ISEQUAL는 true를 돌려줍니다에서 조건이 너무 문자열

관련 문제