указатели — C ++ функция оболочки getenv () не устанавливает значение

Документация 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 при объявлении он остается неинициализированным указателем.

Это указатели, верно? Правильно? Я знаю, это. Должен быть указатели. Я разберусь с ними на днях, но эй — по крайней мере, я получил свой связанный список на работу! Ура!

0

Решение

Ваша вторая функция занимает val ( int) по ссылке: void getEnv (int &val, const char *var) и так может изменить переменную, переданную ему, как вы ожидаете.

Ваша первая функция занимает valchar*) по значению: void getEnv (char *val, const char *var) так модифицируя val не влияет на переданную ему переменную. Простое решение — просто взять его в качестве ссылки: void getEnv (char *&val, const char *var)

1

Другие решения

Следите за моими комментариями и ответом ОП на них.

Вот что я думал:

#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;
}
0

По вопросам рекламы [email protected]