2010-11-18 8 views
1

나는 C 배열에 저장된 NSString과 비교하고자하는 int currentFontSize를 가지고있다. 여기 코드가있다.int stringWithFormat to NSString 반환 값

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    static NSString* fontSizeName[] = 
    { 
     @"14", 
     @"18", 
     @"22", 
     @"26", 
     @"30", 
     @"34", 
    }; 

    int fontSizeSegmentID; 
    int currentFontSize = 22; 

    NSString *val = [NSString stringWithFormat: @"%i", currentFontSize]; 
    NSString *val2 = @"22"; 
    NSLog(@"the current font size is %i", currentFontSize); 
    NSLog(@"the current font Value1 is %i", val); 
    NSLog(@"the current font Value2 is %i",val2); 
    int i; 
    for (i = 0; i < 6; i++) { 

     NSLog(@"fontSizeNAme:%d",fontSizeName[i]); 
     NSLog(@"val:%d",val); 

      if (fontSizeName[i] == val) { 
       NSLog(@"They are equal"); 
       fontSizeSegmentID = i; 
       break; 
      } 

      NSLog(@"the fontSizeSegmentID is: %i" , fontSizeSegmentID); 
     } 

    [pool drain]; 
    return 0; 
} 

스트래지 부분은 1879919632의 반환 값을 제공하므로 비교가 실패합니다.

2010-11-18 16:56:52.784 testINT[26034:a0f] the current font size is 22 
2010-11-18 16:56:52.786 testINT[26034:a0f] the current font Value1 is 1879919632 
2010-11-18 16:56:52.787 testINT[26034:a0f] the current font Value2 is 4240 
2010-11-18 16:56:52.788 testINT[26034:a0f] fontSizeNAme:4176 
2010-11-18 16:56:52.788 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.788 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.789 testINT[26034:a0f] fontSizeNAme:4208 
2010-11-18 16:56:52.789 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.790 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.790 testINT[26034:a0f] fontSizeNAme:4240 
2010-11-18 16:56:52.790 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.791 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.791 testINT[26034:a0f] fontSizeNAme:4272 
2010-11-18 16:56:52.791 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.792 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.792 testINT[26034:a0f] fontSizeNAme:4304 
2010-11-18 16:56:52.792 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.793 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.793 testINT[26034:a0f] fontSizeNAme:4336 
2010-11-18 16:56:52.794 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.794 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
:

여기
NSLog(@"fontSizeNAme:%d",fontSizeName[i]); 

는 NSLog 내 수익입니다 : 4240대로 동일합니다 : 나는있는 NSString을 하드 코딩 할 때을 val2 = @ "22", 비교가 성공됨에을 val2가 어디 이상한 부분은

아무도 친절하게 왜 나를 설명 할 수 있습니까? 왜 내가 "22"NString을 캐스팅하고 하나의 형식 int가 다른 값을 반환합니까 ????? 감사!

답변

6

Objective-C에서 정수의 문자열 표현을 포함하는 intNSString*을 비교할 수 없습니다. 두 사이의 변환하려면

NSString* [email protected]"11"; 
int i=[s intValue]; // i now contains 11 

는 또한, NSLog% 사양을 사용하면 개체를 해석하는 방법을 지정 하지을 수행 할 필요가있다. 개체의 유형과 일치하는 올바른 % 것을 지정해야합니다. 그렇지 않으면 단지 정크가 표시됩니다. valval2NSString*이기 때문에 그래서, 모두

NSLog(@"the current font Value1 is %i", val); 
NSLog(@"the current font Value2 is %i",val2); 

는 불법입니다. 대신 당신은

NSLog(@"the current font Value1 is %@", val); 
NSLog(@"the current font Value2 is %@",val2); 

또는

NSLog(@"the current font Value1 is %i", [val intValue]); 
NSLog(@"the current font Value2 is %i",[val2 intValue]); 

당신은 하나 ==하여 두 NSString*의를 비교할 수 없습니다 할 필요가있다. 을 사용해야합니다.

1

@ Yuji에 동의합니다. 객관적인 C에서는 정수와 문자열을 비교하지 마십시오. 아마도 어딘가에서 시스템 버퍼로 돌아가는 야생 번호로 끝날 것입니다. 또는 디버깅 방법이있는 경우 out of range exception이 표시 될 수 있습니다.

+0

사실, 프로그램은'int'와 Obj-C 객체에 대한 포인터를 비교할 것입니다.이 객체는 완전히 유효합니다. 단지 비관적 인 결과를 줄 것입니다. –

+0

나는 그것이 내가 말한 것이라고 생각한다. –

+0

@Michael Eakins : 당신이 믿는 것은 무엇이든, 그것은 당신이 말한 것이 아닙니다. 당신은 "당신은 아마도 시스템 버퍼로 실행되는 야생 번호로 끝날 것입니다 ... 또는 ... 범위를 벗어난 예외"라고 말했습니다. 당신이 int에 대한 포인터를 비교한다면 그것들은 일어나지 않을 것이다. – JeremyP