0

NSString を使用して、vsnprintf 関数をコーディングしたいと考えています。

これは私の vsnprintf の実装です:

int my_vsnprintf(char *buffer, size_t count, const char *format, ...)
{
    int iRet;
    va_list ap;
    NSString *pnssBuffer=NULL;
    NSString *pnssFormat;
    const char *pcszBuffer;
    /* Format with NSString */
    pnssFormat=[NSString stringWithCString:format 
    encoding:NSUTF8StringEncoding];
    va_start(ap, format);
    pnssBuffer=[[NSString alloc] initWithFormat:pnssFormat arguments:ap];
    /* Copy to char * */
    pcszBuffer=[pnssBuffer cStringUsingEncoding:NSUTF8StringEncoding];
    memcpy(buffer, pcszBuffer, count);
    iRet=strlen(buffer);
    /* Free */
    [pnssBuffer release];
    va_end(ap);
    return iRet;
}

char * param で呼び出すと、次のように動作します。

    my_vsnprintf(buffer, 256, "hello %s", "world");
NSLog(@"buffer = %s", buffer);

これを正しく出力してください: buffer = hello world

しかし、wchar_t * param で呼び出すと、世界の最初の文字しか取得できません

    my_vsnprintf(buffer, 256, "hello %ls", L"world");
NSLog(@"buffer = %s", buffer);

これを印刷してください: buffer = hello w

理由がわかりません。関数の助けはありますか?

4

1 に答える 1

1

「String Programming Guide」のString Format SpecifiersによるとinitWithFormat:arguments:、フレンドは「%ls」形式をサポートしていません。実際、ここでは "l" 修飾子は無視されます。

「%S」形式がありますが、これは 16 ビット Unicode 文字のシーケンス用であるため、wchar_tどちらにも使用できません。

追加した

wchar_tNSStringは、iPhone およびシミュレーターでは 4 バイトの Unicode (リトルエンディアン) であるため、次のように変換できます。

wchar_t *w = L"Hello world";
NSString *str = [[NSString alloc] initWithBytes:w length:4*wcslen(w)
    encoding:NSUTF32LittleEndianStringEncoding];
于 2012-08-17T19:38:14.793 に答える