1

cplusplus.com 关于getenv()状态的文档...

返回的指针指向一个内部内存块,其内容或有效性可以通过进一步调用来改变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;
}

int版本按预期工作,但我没有从该char版本中得到任何回报,我的意思是什么:如果我没有*textMode在声明时初始化它仍然是一个未初始化的指针。

是指针对吧?对?我知道它是。应该是指点 这些天我会弄清楚它们,但是嘿-至少我的链接列表可以工作了!耶!

4

2 回答 2

1

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

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

于 2017-02-10T21:25:38.763 回答
0

跟进我的评论和 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;
}
于 2017-02-13T16:10:53.027 回答