Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何定义一个函数来返回指向&引用;未找到匹配数据时的值?_C++_Arrays_Pointers - Fatal编程技术网

C++ 如何定义一个函数来返回指向&引用;未找到匹配数据时的值?

C++ 如何定义一个函数来返回指向&引用;未找到匹配数据时的值?,c++,arrays,pointers,C++,Arrays,Pointers,我希望我的函数()在错误条件下始终返回“”字符串,否则返回从无符号长整型变量转换为字符串的字符串 我的初步实施如下: uint32 cfgVariable_1=4; uint32 cfgVariable_2=1; 常量字符*getCfgVariable(常量字符*消息) { char*retValue=“”; if(strcmp(“cfgVariable_1”,msg)=0) { //因为我希望我的函数返回一个常量char*,而返回uint32\u t不是一个选项 sprintf((retVal

我希望我的函数()在错误条件下始终返回“”字符串,否则返回从无符号长整型变量转换为字符串的字符串

我的初步实施如下:

uint32 cfgVariable_1=4;
uint32 cfgVariable_2=1;
常量字符*getCfgVariable(常量字符*消息)
{
char*retValue=“”;
if(strcmp(“cfgVariable_1”,msg)=0)
{
//因为我希望我的函数返回一个常量char*,而返回uint32\u t不是一个选项
sprintf((retValue),“%lu”,cfgVariable_1);
返回(const char*)retValue;
}
否则如果(strcmp(“cfgVariable_2”,msg)=0)
{
//因为我希望我的函数返回一个常量char*,而返回uint32\u t不是一个选项
sprintf((retValue),“%lu”,cfgVariable_2);
返回(const char*)retValue;
}
其他的
{
//错误
}
返回(const char*)retValue;
}
当在不同的实例中调用该函数以获取cfgvariable时,我希望我的函数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)
{
//因为我希望我的函数返回一个常量char*,而返回uint32\u t不是一个选项
sprintf((retValue),“%lu”,cfgVariable_1);
返回(const char*)retValue;
}
否则如果(strcmp(“cfgVariable_2”,msg)=0)
{
//因为我希望我的函数返回一个常量char*,而返回uint32\u t不是一个选项
sprintf((retValue),“%lu”,cfgVariable_2);
返回(const char*)retValue;
}
其他的
{
//错误
}
返回值;
}
在调试过程中,我看到defValue和retValue被指向两个不同的位置,而不会被覆盖。defValue在用“”初始化时总是指向同一地址,而retValue在用“\0”初始化时总是指向不同的地址。有人能解释一下这背后的逻辑吗?我的用例有更好的实现吗

在考虑这些意见后,我的解决方案是:

const char*getCfgVariable(const char*msg)
{
const char*retValue=“”;
std::ostringstream oss;
如果(!strcmp(“cfgVariable_1”,msg))
{
ossConstexpr字符串,如“\0”、“cfgVariable\u 1”等。这些是编译到结果可执行文件中的内存中的常量字符串。尝试将值写入这些字符串是非常危险的!在旧式C中,您必须使用malloc为字符串分配一点内存。这在实践中是一个真正的难题(对于学习C++的人来说并不理想)

一个简单得多的解决方案是开始使用C++字符串对象,STD::String(它处理所有的动态内存分配!)。这应该将问题减少到更简单(最重要的是更安全!):

但是,因为现在retValue是内存中固定的数组,所以返回的字符串只有在下一次调用getCfgVariable之前才有效,这可能有点奇怪

const char* A = getCfgVariable("cfgVariable_1");
printf("%s\n", A); // prints '4'

const char* B = getCfgVariable("cfgVariable_2");
printf("%s\n", B); // prints '1'
printf("%s\n", A); // now this will print '1', and not '4'. 

const char* C = getCfgVariable("anythingElse");
printf("%s\n", C); // prints ""
printf("%s\n", B); // prints ""
printf("%s\n", A); // aso prints ""

这里最小的问题是在某些错误条件下返回一个空字符串。这是所示代码中最小的错误。它存在根本性的缺陷,并破坏了一整串内存。
char*retValue=“”
-这将设置一个
char
指针,该指针正好指向潜在可用内存的一个字节。然后:
sprintf((retValue),“%lu”,cfgVariable_1)
这将继续并写入谁知道有多少字节。内存损坏,更不用说一个literal
char
字符串实际上是
const
。您需要完全重新考虑这种方法。由我实现的修复是可行的,但我无法理解其背后的逻辑,-我希望您有代码复查“SamVarshavchik”,它是不可能实现的,它是不可能的,它是不可能的,它是不可能的,它可以在错误的条件下返回空字符串。当然,这是可能的,但是这需要现代C++。这个问题被标记为“C++”,但是所显示的代码是过时的C代码。, SCAFTFE()/CUT>,都是古C库函数。现代C++代码使用 STD::String ,以及其他C++类,正确处理所有存储分配,格式化输出操作,而不是缓冲区溢出倾向<代码> SpRATFF()粗略的估计是,与<>代码> STD::String >,将是大约五行或六行代码,这是一小部分。这是可能的,但是一旦开始使用原始指针,就必须更加注意内存分配和范围。fe返回一个指向堆栈中分配的内存的指针,除非它是静态的,但这还有其他复杂之处。“完全危险”-新的“调用未定义的行为”。仅供参考,您也可以不使用字符串流。它是为这种情况而设计的,仅凭名称就可以明显看出(读起来像一本书),可能比建立格式化字符串流更有效。@robthebloke:请对我刚才添加的最终解决方案发表意见。@Rookie_Coder2318这不是解决方案。您现在返回已释放内存的地址。您不能这样做!您必须返回已分配的内存(稍后再释放).这是对的
uint32 cfgVariable_1 = 4;
uint32 cfgVariable_2 = 1;

const char* getCfgVariable (const char* msg)
{
  static char retValue[32] = {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 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 retValue;
  }
  else
 {
  //error
 }
 return retValue;
}
const char* A = getCfgVariable("cfgVariable_1");
printf("%s\n", A); // prints '4'

const char* B = getCfgVariable("cfgVariable_2");
printf("%s\n", B); // prints '1'
printf("%s\n", A); // now this will print '1', and not '4'. 

const char* C = getCfgVariable("anythingElse");
printf("%s\n", C); // prints ""
printf("%s\n", B); // prints ""
printf("%s\n", A); // aso prints ""