【发布时间】:2020-03-12 11:15:36
【问题描述】:
我发现了几个关于此的问题,但没有一个可以帮助我完成这项工作。 我有以下。
struct general_calibration_t {
double pressure_span;
double pressure_offset;
double steam_temperature_offset;
};
struct general_t {
struct general_calibration_t calibration;
};
int generateGenericJSON(string* str, const char* json, ...) {
char* tmp = (char*)malloc(2048);
if (tmp == NULL)
goto fail;
va_list ap;
va_start(ap, json);
const int amount = snprintf(tmp, 2048, json, ap);
va_end(ap);
if (amount >= 2048 || amount < 0)
goto release;
string_new_value(str, tmp, amount);
free(tmp);
return 0;
release:
free(tmp);
fail:
return 1;
}
调用如下:
struct general_t data;
data.calibration.pressure_offset = 1.0;
data.calibration.pressure_span = 34.8;
data.calibration.steam_temperature_offset = 20.0;
string calibrationStr;
generateGenericJSON(&calibrationStr,
"\"Calibration\":{\"PressureSpan\":%.3f,\"PressureOffset\":%.3f,\"SteamTemperatureOffset\":%.3f}",
data.calibration.pressure_span,
data.calibration.pressure_offset,
data.calibration.steam_temperature_offset);
我的输出如下:
"Calibration":{"PressureSpan":0.000,"PressureOffset":0.000,"SteamTemperatureOffset":-92559631349317830736831783200707727132248687965119994463780864.000}
将va_list 传递给snprintf 时出现问题。如果我使用va_arg 遍历函数generateGenericJSON 中的列表,则数据是正确的。我尝试将va_list 作为指针传递,但我得到了相同的无效数据。
将 va_list 传递给 snprintf 时我做错了什么?
【问题讨论】:
-
@dash-o 这绝对是
goto的恰当用法。 -
@dash-o 这在内核、驱动程序和 rtos 代码中很常见。对 Linux 内核的快速 grep 显示其使用了 155488 次。
标签: c printf variadic-functions