2010-11-18 16 views
1

私はC配列に格納されたNSStringと比較したいint currentFontSizeを持っています。ここにコードがあります。int stringWithFormatから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の戻り値を与えるvalge部分は、Valです。 4240、それは同じです::私はval2の= @「22」としてNSStringのをハードコーディングするときとval2がどこにある奇妙な部分は、比較が成功したとなっているここで

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

はのNSLogの私のリターンです:

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 

誰でも親切に私のことを説明できますか?なぜ私は@ "22" NStringをキャストし、1つの形式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); 

は、違法です。代わりに、あなたはどちらか==で2つのNSString* Sを比較することはできません

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

を行う必要があります。 を使用する必要があります。

1

私は@ゆうじに同意しますが、客観的なCでは、文字列と整数を比較しないでください。あなたはたぶんどこかでシステムバッファーに走っているワイルドナンバーで終わるでしょう。また、デバッグ方法がある場合は、out of range exceptionが表示されます。

+0

実際には、プログラムは、 'int'とあなたのObj-Cオブジェクトへのポインタとの比較を行います。これは完全に有効です。 –

+0

私はそれが私が言ったものだと信じています。 –

+0

@Michael Eakins:あなたが信じていることは、あなたが言ったことではありません。あなたは "あなたはおそらく、システム・バッファーへのワイルド・ナンバーまたは...範囲外の例外"で終わると言いました。 intへのポインタを比較するとどちらも起こりません。 – JeremyP

関連する問題