C++ C++;getenv()包装函数未设置值

C++ C++;getenv()包装函数未设置值,c++,pointers,getenv,C++,Pointers,Getenv,CPluPlus.com关于州的文档 返回的指针指向内部内存块,进一步调用getenv …我的意思是,“如果你想保留内容,就复制它。”因此,由于我需要检索几个变量,我编写了几个小包装函数: #include <iostream> #include <string.h> using namespace std; void getEnv (char *val, const char *var) { val = nullptr; char *enVar =

CPluPlus.com关于州的文档

返回的指针指向内部内存块,进一步调用
getenv

…我的意思是,“如果你想保留内容,就复制它。”因此,由于我需要检索几个变量,我编写了几个小包装函数:

#include <iostream>
#include <string.h>

using namespace std;

void getEnv (char *val, const char *var) {
    val = nullptr;
    char *enVar = getenv(var);
    if (enVar != nullptr) {
        val = new char[strlen(enVar) + 1];
        strcpy(val, enVar);
    }
}

void getEnv (int &val,  const char *var) {
    val = -1;
    char *enVar = getenv(var);
    if (enVar != nullptr) {
        val = atoi(enVar);
    }
}

int main() {
    char *textMode = nullptr;
    int  cLen = 0;

    getEnv(cLen, "CONTENT_LENGTH");
    cout << cLen << endl << endl;

    getEnv(textMode, "TEXT_MODE");
    if (textMode == nullptr)
        cout << "Not set.";
    else 
        cout << "[" << textMode << "]<br>\n";

    return 0;
}
#包括
#包括
使用名称空间std;
void getEnv(字符*val,常量字符*var){
val=nullptr;
char*enVar=getenv(var);
如果(enVar!=nullptr){
val=新字符[strlen(enVar)+1];
strcpy(val,enVar);
}
}
void getEnv(int&val,const char*var){
val=-1;
char*enVar=getenv(var);
如果(enVar!=nullptr){
val=atoi(enVar);
}
}
int main(){
char*textMode=nullptr;
int-cLen=0;
getEnv(cLen,“内容长度”);

cout您的第二个函数通过引用获取
val
(an
int
):
void getEnv(int&val,const char*var)
,因此可以按预期修改传递给它的变量


您的第一个函数按值获取
val
(a
char*
):
void-getEnv(char*val,const-char*var)
,因此修改
val
对传递给它的变量没有影响。一个简单的解决方案是将其作为引用:
void-getEnv(char*val,const-char*var)

跟进我的评论和OP对它们的回应

我是这么想的:

#include <iostream>
#include <string.h>

using namespace std;

// Use a class to encapsulate the data need to be captured
// in an environment variable.    
class EnvironmentVariable
{
   public:

      EnvironmentVariable(char const* name) : name_(name), isSet_(false)
      {
         char *val = getenv(name);
         if ( val != nullptr )
         {
            isSet_ = true;
            this->value_ = val;
         }
      }

      bool isSet() const
      {
         return isSet_;
      }

      void getValue(char const*& val) const
      {
         if ( isSet_ )
         {
            val = this->value_.c_str();
         }
         else
         {
            val = nullptr;
         }
      }

      void getValue(int& val) const
      {
         if ( isSet_ )
         {
            val = stoi(this->value_);
         }
         else
         {
            val = 0; // Find a suitable default value
         }
      }

   private:
      std::string name_;
      std::string value_;
      bool isSet_;
};

int main() {
   char const* textMode = nullptr;
   int  cLen = 0;

   EnvironmentVariable env1("CONTENT_LENGTH");

   env1.getValue(cLen);
   cout << cLen << endl << endl;

   EnvironmentVariable env2("TEXT_MODE");
   env2.getValue(textMode);

   if (textMode == nullptr)
      cout << "Not set.\n";
   else 
      cout << "[" << textMode << "]<br>\n";

   return 0;
}
#包括
#包括
使用名称空间std;
//使用类来封装需要捕获的数据
//在环境变量中。
类环境变量
{
公众:
环境变量(char const*name):name(name),isSet(false)
{
char*val=getenv(名称);
如果(val!=nullptr)
{
isSet=真;
该->值=val;
}
}
bool isSet()常数
{
返回设置;
}
void getValue(字符常量*&val)常量
{
如果(isSet)
{
val=this->value_u.c_str();
}
其他的
{
val=nullptr;
}
}
void getValue(int&val)常量
{
如果(isSet)
{
val=stoi(此->值_u3;);
}
其他的
{
val=0;//查找合适的默认值
}
}
私人:
std::字符串名称;
std::字符串值;
布尔伊塞特;
};
int main(){
char const*textMode=nullptr;
int-cLen=0;
环境变量env1(“内容长度”);
env1.getValue(cLen);

难道你的程序不能编译。它编译得很好。在过去的一个小时里,我一直在摆弄它,尝试各种各样的东西,每次都编译。注意你是如何把
int
作为参考,而把
char*
作为值。是的,因为我不需要为
int
分配内存。
int
int
,所以我可以通过引用传递它,但是
char
必须是一个指针,这样我才能为它分配内存。分配内存与此无关。在这两种情况下,你都在修改
val
,但当它是引用时,这只会产生外部影响。看我的答案。啊!我明白了。我不知道你可以这么做——我知道我没想到,因为它是一个指针,它已经在传递地址了,所以这不会是一个问题。不过,我想我明白了——它在传递
textMod
的值,也就是
nullptr
,而函数对此无能为力。好的,谢谢。总有一天我会得到它的!我喜欢它。有几个问题:1)这是什么
:name(name),isSet(false)
我猜它会指定默认值?为什么不在构造函数中这样做呢?而且
name(name)
不会在任何地方使用。2)你不会
删除val
(见我上面的最后一条评论)“不需要吗?”@ AlnLime[<代码> Name e>代码>可供使用。您可以添加成员函数<代码> STD::String GETNAMEL();con>;<代码>提供对环境变量名的访问。@ AlnLimple,<代码>:Name Ey(name),ISStIGI[false(false)< /COD> >部分是C++语法,用于初始化这些成员变量。