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