nRF52840 上 va_start() 的省略号问题
Ellipsis issue with va_start() on nRF52840
我想使用 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是空的。我做错了什么?
行后
int ret = vsprintf(str, log, args);
你的 str 变量包含格式化的字符串(例如 str 是 "button 2 pressed, 3658, ca, a"。然而,你的下一句覆盖这个数据。当你调用 sprintf 时,并用 'log' 变量覆盖 str 的数据这是格式 ("button %d pressed, %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));
}
BTW,推荐使用snprint,vsnprintf,避免缓冲区溢出。由于格式包含“%s”,可能会打印出大于 256 字节的大字符串。
我想使用 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是空的。我做错了什么?
行后
int ret = vsprintf(str, log, args);
你的 str 变量包含格式化的字符串(例如 str 是 "button 2 pressed, 3658, ca, a"。然而,你的下一句覆盖这个数据。当你调用 sprintf 时,并用 'log' 变量覆盖 str 的数据这是格式 ("button %d pressed, %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));
}
BTW,推荐使用snprint,vsnprintf,避免缓冲区溢出。由于格式包含“%s”,可能会打印出大于 256 字节的大字符串。