微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Mac OS X / Linux上的_vscwprintf

我正在为Windows编写的Mac OS X上移植应用程序。

在这个应用程序中,有许多_vscwprintf和_vscprintf的实例。

这个问题帮助我在Mac OS X上实现_vsprintf。但是_vswprintf的相同技术却不能工作。

任何人都可以在Mac OS X上提供_vscwprintf的替代scheme吗? 或者有任何相当的方法呢?

.Net混淆器

Magic COLORREF / RGB值决定何时使用浅色/深色文字

如何设置箱子风扇速度

在Linux中按Ctrl + C中断事件处理

如何通过块上传背景块中的文件

如何在汇编程序中使用C库?

第一次调用findwindowex / EnumChildWindows之后caching了一个控制树吗?

如何从Linux上的特定接口发送UDP数据包?

来自socket()调用错误

为什么没有加载持久的用户设置?

微软将这些函数描述为返回字符串被格式化时将使用的字符数 – 注意它们被记录为不包括空终止符。

int _vscprintf( const char *format,va_list argptr ); int _vscwprintf( const wchar_t *format,va_list argptr );

初步答案

因此,这些函数可以用vsprintf()和vswprintf()来模拟:

int _vscprintf(const char *format,va_list argptr) { return(vsnprintf(0,format,argptr)); }

int _vscwprintf(const wchar_t *format,va_list argptr) { return(vswprintf(0,argptr)); }

是否删除前导下划线由您决定; 我会。

请注意,上面的_vscwprintf()实现是有缺陷的; 看下面的代码

vscprintf()和scprintf()

道歉:我写了vsprintf()我需要写vsnprintf() (现在已经在上面的代码中修复了); 然而, vswprintf()与缓冲区长度已经有了更安全的接口,所以没有vsnwprintf() 。 我之所以愿意在发布之前(或者之后不久)测试编译代码是有原因的,因为在几天之内没有足够的资源去做这件事,这是令人厌烦的。

这是vscprintf() (和scprintf() )的scprintf() :

#include <stdio.h> #include <stdarg.h> extern int vscprintf(const char *format,va_list argptr); extern int scprintf(const char *format,...); int vscprintf(const char *format,argptr)); } int scprintf(const char *format,...) { va_list args; va_start(args,format); int rc = vscprintf(format,args); va_end(args); return rc; } int main(void) { int l = scprintf("%-8s %8dn","abc",123); if (l > 0) { char buffer[l+1]; int n = snprintf(buffer,sizeof(buffer),"%-8s %8dn",123); printf("%d = %d: %s",l,n,buffer); } return 0; }

输出

18 = 18: abc 123

vscwprintf()和scwprintf()

因为vswprintf()函数不如vsnprintf()函数有帮助,所以变得很难模拟_vscwprintf() 。 特别是,如果格式化的字符串不适合格式化的空间, vswprintf()报告错误,而vsnprintf()报告缓冲区中需要的字符数量。 因此,你必须通过试验和错误的工作:

#include <stdio.h> #include <stdarg.h> #include <wchar.h> extern int vscwprintf(const wchar_t *format,va_list argptr); extern int scwprintf(const wchar_t *format,...); int vscwprintf(const wchar_t *format,va_list argptr) { // Unlike vsnprintf(),vswprintf() does not tell you how many // characters would have been written if there was space enough in // the buffer - it just reports an error when there is not enough // space. Assume a moderately large machine so kilobytes of wchar_t // on the stack is not a problem. int buf_size = 1024; while (buf_size < 1024 * 1024) { va_list args; va_copy(args,argptr); wchar_t buffer[buf_size]; int fmt_size = vswprintf(buffer,sizeof(buffer)/sizeof(buffer[0]),args); if (fmt_size >= 0) return fmt_size; buf_size *= 2; } return -1; } int scwprintf(const wchar_t *format,format); int rc = vscwprintf(format,args); va_end(args); return rc; } int main(void) { int l = scwprintf(L"%-8ls %8dn",L"abc",123); if (l > 0) { wchar_t buffer[l+1]; int n = swprintf(buffer,L"%-8ls %8dn",123); wprintf(L"%d = %d: %ls",buffer); } return 0; }

运行时,会产生输出

18 = 18: abc 123

(和以前一样)。

使用GCC 4.7.3(基于Mac OS X 10.7.5构建,但不会引起任何问题)在Mac OS X 10.8.3上进行测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐