在msvc和gcc上使用vsnprintf时的不同行为

时间:2017-06-01 05:25:51

标签: c++ g++ printf

我有以下代码使用Arrays.deepEquals附加缓冲区。

        var jo = JObject.Parse(jsonString);
        var a =jo["geonames"].Select(city => city["name"].ToString()).ToList();

        //Or
        foreach (var cityInfo in jo["geonames"])
        {
            Console.WriteLine(cityInfo["name"]);
        }

它在Windows和Linux上都提供了不同的输出。 在Windows上(使用msvc-14.0编译器),它提供所需的vsnprintf()输出。

但是在Linux上(使用gcc-5.4),它只打印#include <stdio.h> #include <stdarg.h> using namespace std; void MyPrintFunc(char *buffer, size_t sizeOfBuffer, const char* format, ...) { va_list arg; va_start(arg, format); vsnprintf(buffer, sizeOfBuffer, format, arg); va_end(arg); } int main() { char buffer[1000] = { 0 }; const char* abc = "abc"; const char* def = "def"; MyPrintFunc(buffer, 1000, "%s", abc); MyPrintFunc(buffer, 1000, "%s%s", buffer, def); printf("%s\n", buffer); return 0; } 的输出。

如何获得正确的输出?

2 个答案:

答案 0 :(得分:1)

不要使用相同的缓冲区作为vsnprintf的输出和输入。

答案 1 :(得分:0)

感谢大家的投入。

我的解决方法是创建缓冲区的副本,如果MyPrintFunc()的用户使用它来附加缓冲区:

void MyPrintFunc(char *buffer, size_t sizeOfBuffer, const char* format, ...)
{
   va_list arg;
   va_list arg_copy;

   va_start(arg, format);
   va_copy(arg_copy, arg);

   if (buffer == va_arg(arg, char*))
   {
      char temp[strlen(buffer)];
      strcpy(temp, buffer);
      MyPrintFunc(buffer, sizeOfBuffer, format, temp, va_arg(arg,char*));
   }
   else
   {
      vsnprintf(buffer, sizeOfBuffer, format, arg_copy);
   }

   va_end(arg);
   va_end(arg_copy);
}