我有以下声明:
vsnprintf(target, size - 1, "%ls_%ls", str16_1, str16_2);
为什么这会在gcc上失败?
我在Windows上使用过这样的:
vsnprintf(target, size - 1, "%S_%S", str16_1, str16_2);
它按预期工作。 在gcc文档中我发现%S是%ls的同义词,但我不能使用它。 我也试过%S,但是没有用。 我在具有可变参数列表的函数中使用它。 有可能无法工作,因为我更改了传递给va_start的格式变量吗? 我必须搜索%S并将其替换为格式变量中的%ls。
function如下:
void f(const char* format, ...){ char* new_format = format with %S replaced with %ls; va_list argptr; va_start(args, format); vsnprintf(str, size-1, new_format, argptr); }
我查了一下,new_format是正确的。
谢谢!
尝试使用snprintf
,原因是vsnprintf
。 vsnprintf
采用类型为va_list
的参数,而不是文字可变参数列表。 例如:
va_list ap; va_start (ap, first_arg_in_this_function); vsnprintf (buf, size, format_str, ap); va_end (ap);
而sprintf:
snprintf (buf, size, format_str, x, y);
当…时使用v*printf
否则只需使用*printf
您对va_start
使用不正确。 在这个声明中:
va_start(args, new_format);
你不是指f()
函数的format
参数。 va_start()
的第二个参数必须引用函数的forms参数列表中的参数。 其他任何东西都可能是未定义的行为。
编译器使用va_start()
的命名forms参数来确定在函数调用中从哪里开始查找变量参数列表。 它不会自动知道你放在哪里...
在参数列表中(也许你可能会期望它应该,但这不是它的工作方式)。
我查找%ls
for vsnprintf
并发现这是打印/格式化宽字符串的格式说明符,即wide_t *p = L"Hello world!";
在C ++中花了一些时间来玩和谷歌搜索广泛的字符使用(我喜欢下面的页面: http : //www.linux.com/archive/feed/51836 ),但我想我找出了你的问题。
如果将char
字符串传递给%ls
然后它不会扩展,但是如果将wchar_t
字符串传递给%ls
则会打印它。
根据您的信息考虑以下示例代码:
#include #include #include #include char str[100]; void f (const char *format, ...) { va_list args; va_start(args, format); vsnprintf(str, sizeof(str), format, args); va_end(args); } int main () { char *p1 = "1234"; char *p2 = "abcd"; wchar_t *pw1 = L"9876"; wchar_t *pw2 = L"wxyz"; f("%d_%d", 120, 199); printf("numbers: %sn", str); f("%s_%s", p1, p2); printf("char*: %sn", str); f("%ls_%ls", p1, p2); printf("wide char* with char* input: %sn", str); f("%ls_%ls", pw1, pw2); printf("wide char* with wide char* input: %sn", str); return (0); }
我用g ++编译了这个。
make newtest.exe g++ -g -c -MD -Wall -Werror newtest.cxx g++ -o newtest.exe newtest.o -lc -lrt Compilation finished at Thu Jul 29 08:54:57
输出如下:
[SUSE10.1]:201> newtest.exe numbers: 120_199 char*: 1234_abcd wide char* with char* input: wide char* with wide char* input: 9876_wxyz
使用snprintf
。
什么是你的valist
? 变量列表参数的正确类型是带有下划线的va_list
,不是吗?
因为我在Mac上使用它,我发现了一个解决方法:
如何将可变数量的参数“传递”给NSString的+ stringWithFormat:
似乎vsnprintf无法处理16位字符串。 也许是因为wchar_t不是16位。
需要了解更多c/c++开发分享vsnprintf和gcc,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享vsnprintf和gcc相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/978843.html