我有以下代码使用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;
}
的输出。
如何获得正确的输出?
答案 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);
}