0

我想使用 va_start 从省略号中检索我的参数。

这是我的代码:

char str[256];
void nrf_log_flash(bool is_to_save, char * log, ...){
    va_list args;
    va_start(args, log);
    int ret = vsprintf(str, log, args);
    if(is_to_save){
         sprintf(str, "%s : %s\n", nrf_cal_get_time_string(false), log);
         //my_nrf_log_add(str, strlen(str));
    }
    NRF_LOG_INFO("%s", log);
    NRF_LOG_INFO("%s", str);
    NRF_LOG_INFO("%d", ret);
    va_end(args);

}

这是我的电话:

nrf_log_flash(true, "button %d pressed, %u, %x, %c", 2, 3658, 0xca, 'a');

但是我的 va_list 是空的。我究竟做错了什么 ?

4

1 回答 1

1

线后

int ret = vsprintf(str, log, args);

您的 str 变量包含格式化的字符串(例如 str 是“按下按钮 2,3658,ca,a”。但是,您的下一句将覆盖此数据。当您调用 sprintf 时,并使用“log”变量覆盖 str 处的数据是格式(“按下按钮 %d,%u,%x,%c”)

if(is_to_save){
     //THIS CODE OVERWRITE YOUR STR BUFFER
     sprintf(str, "%s : %s\n", nrf_cal_get_time_string(false), log);
     //my_nrf_log_add(str, strlen(str));
}

顺便说一句,建议使用 snprint 和 vsnprintf 以避免缓冲区溢出。由于格式包含“%s”,因此可能会打印一个大于 256 字节的大字符串。

于 2018-08-16T10:12:49.793 回答