2009-06-18 4 views
4

여기에 아주 기본적인 질문이 있습니다. 빨리 대답 할 수있을 것입니다. 제발 내 웃음 거리를 웃지 마세요.객관적인 C 언어의 배열과 문자열을 비교하면

문자열이 있는데 문자열 배열과 비교하고 싶습니다. 문자열이 배열의 일부가 아닌 경우에만 작업을 수행하려고합니다. 나는 작동하지 않는 다음 코드를 시도했다. 나는 이유를 이해하지만, 올바르게 할 수있는 방법을 생각할 수 없다.

저의 불행에서 도와주세요. 사전에

감사

Sjakelien

-(void) findRedundant: (NSString *) aString { 
#define ALPHA_ARRAY [NSArray arrayWithObjects: @"A", @"B", @"C", nil] 
    NSUInteger f; 
    for (f = 0; f < [ALPHA_ARRAY count]; f++) 
    { 
     NSString * stringFromArray = [ALPHA_ARRAY objectAtIndex:f]; 
     if ([aString isEqualToString:stringFromArray]) { 
      // do nothing 

     } else { 
      //do something 
     } 

    } 

} 



[self findRedundant:@"D"]; 
+1

질문에 왜 효과가 없는지 추가 할 수 있습니까? –

답변

12

코드가 제대로 작동하는 것 같습니다. 그것의 끔찍한 코드는 괜찮 았지만, // 아무것도하지 않는 섹션은 어떤 match에도 호출되고 // something something 섹션은 배열의 각 불일치에 대해 호출됩니다. 나는 당신이 // 일치하는 것이 없다면 // 아무 것도하지 않는 섹션이 한 번 실행될 것을 기대하고 있고, // 일치하는 것이 있으면 실행되는 무언가 섹션을 한 번 수행 할 것이라고 생각한다.

-(void) findRedundant: (NSString *) aString { 
#define ALPHA_ARRAY [NSArray arrayWithObjects: @"A", @"B", @"C", nil] 
    BOOL found = NO; 
    NSUInteger f; 
    for (f = 0; f < [ALPHA_ARRAY count]; f++) { 
     NSString * stringFromArray = [ALPHA_ARRAY objectAtIndex:f]; 
     if ([aString isEqualToString:stringFromArray]) { 
      found = YES; 
      break; 
     } 
    } 
    if (found) { 
     // do found 
    } else { 
     // do not found 
    } 
} 

또한, 당신은 명확하게 매크로를 이해하지 못하는 당신이 그들을 사용하지 말아야 할 때 (일반적으로, 당신은 매우 몇 가지 예외를 제외하고,이를 사용해서는 안) : 당신은 아마 싶습니다. 매크로는 텍스트로 대체됩니다. 즉, ALPHA_ARRAY를 사용할 때마다 배열 생성 및 초기화가 발생합니다. 이것은 끔찍한 일입니다.

기본적으로, 당신이하는 일을 훨씬 더 깊이 이해할 때까지 #define을 다시 사용하지 마십시오 (상수 제외). 당신이 읽을 훨씬 쉽고 명확 현대 플랫폼 (10.5 또는 아이폰), 사용할 수있는 빠른 열거를 위해 개발하는 경우,

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 

다음 :이 경우 taebot이 설명 된대로 배열을 만들 것입니다 :

-(void) findRedundant: (NSString *) aString { 
    NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 
    BOOL found = NO; 
    for (NSString* stringFromArray in alphaArray) { 
     if ([aString isEqualToString:stringFromArray]) { 
      found = YES; 
      break; 
     } 
    } 
    if (found) { 
     // do found 
    } else { 
     // do not found 
    } 
} 

그리고 마지막으로, 당신은 당신이 자유로운을 위해 무엇을 할 수 있는지 볼 수있는 NSArray하고있는 NSString에 대한 설명서를 읽어 가야 한 다음 KiwiBastard 지적 것을 containsObject 같은 방법을 찾을 수 있습니다, 당신이 당신의 루틴을 다시 작성할 수 있습니다 예 :

-(void) findRedundant: (NSString *) aString { 
    NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 
    if ([alphaArray containsObject: aString]) { 
     // do found 
    } else { 
     // do not found 
    } 
} 
+0

Peter에게 감사드립니다.유용한 답변이 이미 KiwiBastard에 의해 제공되었지만 귀하의 철저 함이 실제로 내가 요구했던 것 이상을 가르쳐주었습니다. 내 방어 : Alpha Array이 예제를 이해하기 쉽게 만들었습니다. 내 실제 코드에서는 기존 배열을 사용합니다. – Sjakelien

7

나는 위의 코드가 작동하지 않는 이유를 잘 모르겠지만, 당신이 시도가 :

if ([ALPHA_ARRAY containsObject:aString]) 

경우 YES 반환하는 그렇지 않으면 aString이 존재합니다. NO

+0

정말 고마워요. "containsObject"는 내가 그 존재를 알지 못했다. 나는 귀찮은 'for'루프를 없애기 위해 나머지 코드를 검토 할 것이다! – Sjakelien

+0

또한 관심있는 경우 포인터 비교 대신 문자열의 동일성 (isEqualToString)을 비교하여 작동합니다. http://stackoverflow.com/questions/5811121/check-if-nsstring-instance-is-contained-in-an-nsarray – Soulfire

6

#define이 이상하게 보입니다. 나는 ALPHA_ARRAY를 사용할 때마다 다른 NSArray 인스턴스가 생성 될 것이라고 생각한다. NSArray에서 containsObject : 메서드를 사용하는 것이 더 명확합니다.

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 
if (![alphaArray containsObject:aString]) { 
    // do something 
}