• vasprintf的实现


    有些系统,例如AIX,没有vasprintf和asprintf ,如果是做porting,有时需要写一个简单的代替。

    代码如下:

     1 #if !defined(HAVE_VASPRINTF) 
     2 #if defined(WINDOWS) 
     3 int 
     4 vasprintf (char **ptr, const char *format, va_list ap) 
     5 { 
     6   int len; 
     7  
     8   len = _vscprintf_p (format, ap) + 1; 
     9   *ptr = (char *) malloc (len * sizeof (char)); 
    10   if (!*ptr) 
    11     { 
    12       return -1; 
    13     } 
    14  
    15   return _vsprintf_p (*ptr, len, format, ap); 
    16 } 
    17 #else 
    18 int 
    19 vasprintf (char **ptr, const char *format, va_list ap) 
    20 { 
    21   va_list ap_copy; 
    22  
    23   /* Make sure it is determinate, despite manuals indicating otherwise */ 
    24   *ptr = 0; 
    25  
    26   va_copy(ap_copy, ap); 
    27   int count = vsnprintf(NULL, 0, format, ap); 
    28   if (count >= 0) 
    29         { 
    30           char* buffer = malloc(count + 1); 
    31           if (buffer != NULL) 
    32                 { 
    33                   count = vsnprintf(buffer, count + 1, format, ap_copy); 
    34                   if (count < 0) 
    35                         free(buffer); 
    36                   else 
    37                         *ptr = buffer; 
    38                 } 
    39         } 
    40   va_end(ap_copy); 
    41  
    42   return count; 
    43  
    44 } 
    45 #endif 
    46 #endif /* !HAVE_VASPRINTF */ 
    47  
    48 #if !defined(HAVE_ASPRINTF) 
    49 int 
    50 asprintf (char **ptr, const char *format, ...) 
    51 { 
    52   va_list ap; 
    53   int ret; 
    54  
    55   *ptr = NULL; 
    56  
    57   va_start (ap, format); 
    58   ret = vasprintf (ptr, format, ap); 
    59   va_end (ap); 
    60  
    61   return ret; 
    62 } 
    63 #endif /* !HAVE_ASPRINTF */ 
    下面是一个完整的例子:
     1 #include <stdio.h> 
     2 #include <stdarg.h> 
     3 #include <stdlib.h> 
     4 #include <string.h> 
     5  
     6 int 
     7 myvasprintf (char **ptr, const char *format, va_list ap) 
     8 { 
     9   va_list ap_copy; 
    10  
    11   /* Make sure it is determinate, despite manuals indicating otherwise */ 
    12   *ptr = 0; 
    13  
    14   va_copy(ap_copy, ap); 
    15   int count = vsnprintf(NULL, 0, format, ap); 
    16   if (count >= 0) 
    17     { 
    18       char* buffer = malloc(count + 1); 
    19       if (buffer != NULL) 
    20         { 
    21           count = vsnprintf(buffer, count + 1, format, ap_copy); 
    22           if (count < 0) 
    23             free(buffer); 
    24           else 
    25             *ptr = buffer; 
    26         } 
    27     } 
    28   va_end(ap_copy); 
    29  
    30   return count; 
    31  
    32 } 
    33  
    34 void 
    35 print_warning (char **buffer, const char *fmt, ...) 
    36 { 
    37   va_list ap; 
    38   va_start (ap, fmt); 
    39   myvasprintf (buffer, fmt, ap); 
    40   va_end (ap); 
    41 } 
    42  
    43 int main() 
    44 { 
    45   char *buffer; 
    46   int a = 99999; 
    47   int b = 9; 
    48   print_warning(&buffer, "hello, world, %d * %d = %d, %s
    ", a, b, a * b, "finished!!" ); 
    49  
    50   printf(buffer); 
    51   return 0; 
    52 } 

    上述代码的执行结果如下:

    hello, world, 99999 * 9 = 899991, finished!!

  • 相关阅读:
    WPF 依赖属性
    WPF 利用附加属性创建FreezableCollection集合和反射实现控件参数以MVVM模式传递
    VS Code 使用插件让HTML和JS代码运行在火狐浏览器
    WPF 键盘导航附加属性解决TreeView的Tab导航焦点问题
    WPF 透视相机的UpDirection(向上方向)
    ABP框架——集成Mysql
    CentOS7部署.Net Core2.0站点(中)
    CentOS7部署.Net Core2.0站点(上)
    (转)非常完善的Log4net详细说明
    GitHub for Windows提交失败“failed to sync this branch”
  • 原文地址:https://www.cnblogs.com/shudai/p/3342477.html
Copyright © 2020-2023  润新知