2

我面临一个奇怪的问题。我根据构建定义使用 sprintf 或 swprintf 是否有 unicode。我已经将这些函数包装在我自己的函数中,如下所示:

int mysprintf( MCHAR* str,size_t size, const MCHAR* format, ... )
{
#ifdef MYUNICODE
    return swprintf( str, size, format);
#else
    return snprintf( str, format);
#endif
}

这些函数位于 String 类中,该类是一个单独的项目,并被编译为 lib。我在另一个程序中使用它。现在如果我使用 mysprintf()

msprintf(str,10, _M("%d,%d"),height,width);

我在字符串缓冲区中得到了一些垃圾值。但是,如果我直接从程序中调用 swprintf 函数,它就可以正常工作。我在构建中定义了 UNICODE,并且确实调用了函数 swprintf,但它填充了一些垃圾值。我不明白出了什么问题。

谢谢阿米特

4

2 回答 2

1

您需要将 mysprintf 函数中的 ... 参数传递给它包含的 prrintf 函数。为此,您应该使用 vprintf() 系列函数 - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/0zf95wk0%28VS.71%29.aspx

于 2009-05-21T07:04:34.450 回答
1

问题确实在于您有自己的函数,其参数数量可变。您需要获取指向参数列表的指针并将其传递给被调用者。va_start 使您能够做到这一点,它需要参数列表中的最后一个指针指向您的函数。

   int mysprintf( MCHAR* str, size_t size, const MCHAR* format, ... )
    {
      va_list args;
      va_start(args, format);

      int result;

    #ifdef MYUNICODE
        result = vswprintf( str, size, format, args);
    #else
        result = ..
    #endif

      va_end(args);

      return result;
   }

干杯!

于 2009-05-21T09:25:39.453 回答