传递va_list导致结果无效数据

问题描述 投票:1回答:1

我已经发现了几个问题,但是没有一个问题能帮助我解决这个问题。我有以下内容。


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时,我做错了什么?

c printf variadic-functions
1个回答
2
投票

将这个va_list传递给snprintf时,我做错了什么?

您想使用vsnprintf()而不是vsnprintf()


跟随dash-osnprintf():尝试避免(可能的)spagetti代码。

处理不同成功/失败案例的可能方法是:

comment
© www.soinside.com 2019 - 2024. All rights reserved.