c/c++语言开发共享vsnprintf和gcc

我有以下声明:

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 ,原因是vsnprintfvsnprintf采用类型为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

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐