std :: string(空char *)错误:basic_string :: _ S_construct null无效错误

时间:2018-06-12 09:17:47

标签: c++

在Debian上,我需要读取一个环境变量,否则返回一个空字符串。这是我的代码:

std::string getEnv(std::string var)
{
    char* val = ::getenv(var.c_str());
    std::string retVal(val);
    return retVal;
}

找不到环境变量时,我收到以下错误:

basic_string::_S_construct null not valid error

调试后,当我尝试向其中加载空val时,错误代码发生在std::string retVal(val)上。

我从一个空的char *中加载一个字符串会起作用,但是看不到。

如何修复上述代码,以便在环境变量不存在的情况下使其正常工作?

2 个答案:

答案 0 :(得分:6)

来自man getenv

  

getenv()函数返回指向环境中值的指针,如果没有匹配则返回NULL

因此,您需要考虑val == NULL

的情况
std::string getEnv(std::string var)
{
    const char* val = ::getenv(var.c_str());
    if (val == nullptr)
        return std::string("");
    return std::string(val);
}

将是一种可能的解决方案(如果未找到var,则返回空字符串)。

答案 1 :(得分:0)

您可以使用string::data()函数来获取underling buffer指针的地址。

尝试var.c_str()或var.data()。

  std::string getEnv(std::string var)
    {
        char* val = ::getenv(var.data());
        std::string retVal(val ? val : "");
        return retVal;
    }

对我而言。

val ? val : ""以避免将NULL传递给std::string()构造函数