Objective c 使用NSString的IOS vsnprintf实现

Objective c 使用NSString的IOS vsnprintf实现,objective-c,ios,nsstring,printf,Objective C,Ios,Nsstring,Printf,我想用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 N

我想用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

    my_vsnprintf(buffer, 256, "hello %ls", L"world");
NSLog(@"buffer = %s", buffer);
但是当我用wchar\u t*param调用它时,我只得到了世界的第一个字符

    my_vsnprintf(buffer, 256, "hello %ls", L"world");
NSLog(@"buffer = %s", buffer);
打印此项:buffer=hello w

我不明白为什么,对我的函数有什么帮助吗?

根据《字符串编程指南》中的
initWithFormat:arguments:
和friends不支持“%ls”格式。实际上,这里忽略了“l”修饰符

有一种“%S”格式,但它用于16位Unicode字符序列,因此您也不能将其用于
wchar\t

已添加

wchar\u t
在iPhone和模拟器上是4字节的Unicode(little-endian),因此您可以将其转换为
NSString
,如下所示:

wchar_t *w = L"Hello world";
NSString *str = [[NSString alloc] initWithBytes:w length:4*wcslen(w)
    encoding:NSUTF32LittleEndianStringEncoding];

vsnprintf
的签名是
int-vsnprintf(char*str,size\u t size,const-char*format,va\u list ap)
,它需要
va\u list
而不是
@dasblinkenlight是的,但它不会改变我的问题的任何东西……感谢这个有用的答案。是否有方法创建“%ls”格式的NSString?没有initWithFormat?@TheFrancisOne:请查看我的更新答案。希望对你有帮助。谢谢你的回复。不幸的是,这段代码在我的例子中无法工作,因为我得到了一个可以用“wchar*”或“int”或“char*”或…填充的va_列表,我不知道有一个内置的格式函数可以正确地与wchar_t一起工作。因此,唯一的解决方案似乎是您自己解析格式字符串,并根据格式说明符使用va_start/va_arg/va_end获取相应的参数,并将它们转换为NSString。对于wchar\t,您可以使用我的答案中的代码。