objective-c - iOS vsnprintf 使用 NSString 实现

标签 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 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 * 参数调用它时,它起作用了:

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

正确打印:buffer = hello world

但是当我用 wchar_t * 参数调用它时,我只得到 world 的拳头字符

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

打印这个:buffer = hello w

我不明白为什么,对我的功能有帮助吗?

最佳答案

根据String Format Specifiers 《字符串编程指南》中,initWithFormat:arguments:等 friend 不支持“%ls”格式。事实上,这里忽略了“l”修饰符。

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

已添加

wchar_t 在 iPhone 和模拟器上是 4 字节 Unicode(小端),因此您可以将其转换为 NSString,如下所示:

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

关于objective-c - iOS vsnprintf 使用 NSString 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12009193/

相关文章:

objective-c - ASIHTTPRequestErrorDomain 代码=8。无法将文件从临时目录移动到文档

ios - 从我的应用程序打开优步,在不使用 sdk 的情况下预先填充上车和下车位置

ios - 将 NSString 转换为 NSDate,添加时间

ios - 将NSString转换为NSDate并返回不同的格式NSString

swift - 在 Swift 中使用 UnsafeMutablePointer 编码和解码字符串

ios - 将数据传递给 Singleton iOS

ios - UINavigationBar 没有立即更新颜色

c++ - 如何在 C++ 函数中访问 iOS 项目中的文件?

objective-c - ARC 的内存泄漏

ios - 如何使用压缩算法进行图像压缩,即 LZ4 、 LZMA 、 ZLIB swift