Документация 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
при объявлении он остается неинициализированным указателем.
Это указатели, верно? Правильно? Я знаю, это. Должен быть указатели. Я разберусь с ними на днях, но эй — по крайней мере, я получил свой связанный список на работу! Ура!
Ваша вторая функция занимает val
( int
) по ссылке: void getEnv (int &val, const char *var)
и так может изменить переменную, переданную ему, как вы ожидаете.
Ваша первая функция занимает val
(а char*
) по значению: void getEnv (char *val, const char *var)
так модифицируя val
не влияет на переданную ему переменную. Простое решение — просто взять его в качестве ссылки: void getEnv (char *&val, const char *var)
Следите за моими комментариями и ответом ОП на них.
Вот что я думал:
#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;
}