C++ C++;getenv()包装函数未设置值
CPluPlus.com关于州的文档 返回的指针指向内部内存块,进一步调用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 =
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
(anint
):void getEnv(int&val,const char*var)
,因此可以按预期修改传递给它的变量
您的第一个函数按值获取val
(achar*
):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++语法,用于初始化这些成员变量。