Я хочу, чтобы моя функция () всегда возвращала строку "" в условиях ошибки, иначе возвращает строку, которая преобразуется в строку из длинной целой переменной без знака.
Моя первоначальная реализация выглядит следующим образом:
uint32 cfgVariable_1 = 4;
uint32 cfgVariable_2 = 1;
const char* getCfgVariable (const char* msg)
{
char* retValue = "";
if(strcmp("cfgVariable_1", msg)==0)
{
// Since I want my function to return a const char* and returning uint32_t is not an option
sprintf((retValue), "%lu", cfgVariable_1);
return (const char*)retValue;
}
else if(strcmp("cfgVariable_2", msg)==0)
{
// Since I want my function to return a const char* and returning uint32_t is not an option
sprintf((retValue), "%lu", cfgVariable_2);
return (const char*)retValue;
}
else
{
//error
}
return (const char*) retValue;
}
Когда функция вызывается в разных экземплярах для получения cfgVariables, я ожидаю, что моя функция getCfgVariable () вернет "" в случае ошибки,когда совпадений не найдено.Где-то в коде:
const char* CfgValue = NULL;
CfgValue = getCfgVariable("cfgVariable_1");
Здесь CfgValue указывает на местоположение, которое содержит 4
позже
const char* CfgValue = NULL;
CfgValue = getCfgVariable("cfgVariable_3");
Я ожидаю получить "" назад, но я получаю 4вместо этого (CfgValue получает тот же адрес, что и раньше).
Исправление, реализованное мной, работает, но я не могу понять логику, стоящую за ним, исправление:
const char* getCfgVariable (const char* msg)
{
const char* defValue = "";
char* retValue = "\0";
if(strcmp("cfgVariable_1", msg)==0)
{
// Since I want my function to return a const char* and returning uint32_t is not an option
sprintf((retValue), "%lu", cfgVariable_1);
return (const char*)retValue;
}
else if(strcmp("cfgVariable_2", msg)==0)
{
// Since I want my function to return a const char* and returning uint32_t is not an option
sprintf((retValue), "%lu", cfgVariable_2);
return (const char*)retValue;
}
else
{
//error
}
return defValue;
}
Я вижу во время отладки это defValueи retValue указывают на два разных местоположения, которые не перезаписываются.defValue всегда указывается на один и тот же адрес, когда инициализируется с помощью «», а retValue указывается на другой адрес, когда инициализируется с помощью «\ 0».Кто-нибудь может объяснить логику этого?Есть ли лучшая реализация для моего варианта использования?
Мое решение после рассмотрения комментариев:
const char* getCfgVariable (const char* msg)
{
const char* retValue = "";
std::ostringstream oss;
if(!strcmp("cfgVariable_1", msg))
{
oss << cfgVariable_1;
}
else if(!strcmp("cfgVariable_2", msg))
{
oss << cfgVariable_2;
}
else
{
//error
return retValue;
}
const std::string tmp = oss.str();
retValue = tmp.c_str();
return retValue;
}
Спасибо за комментарии, и это решение все еще открыто для дальнейших предложений по улучшению.