【问题标题】:C++ environmental variableC++ 环境变量
【发布时间】:2018-10-08 13:11:29
【问题描述】:

我要做的是获取环境变量值并在代码本身中使用它。

我想做的是(变量设置为export UTMZONE="33T"):

char UTMZone[4] = getenv("UTMZONE");

我收到以下错误:

error: array must be initialized with a brace-enclosed initializer

我认为问题在于混合类型,但我不知道我必须进行什么样的转换。

【问题讨论】:

  • 数组不能作为一个整体分配。对字符数组使用std::string
  • 如果你不反对我建议std::string UTMZone = std::getenv("UTMZONE");,否则你需要strcpy或类似的
  • (致评论者:如果您有一个有效的答案,请将其作为答案放在下面,以便 Bostja 可以接受)
  • 大家好,感谢您的及时回复。 @CoryKramer,问题是我在未来的函数中使用它并且我需要const char*,因为我在编译时收到以下错误:error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘const char*’ for argument ‘4’ to ‘void UTMtoLL(int, double, double, const char*, double&, double&)’。对于strcpy,我是否必须将其设置为cost char* env = getenv("UTMZONE"); char UTMZone[4]; strcpy(UTMZone, env)?正如我尝试过的那样,也没有工作。
  • 如果您稍后需要const char*,您可以根据需要直接说UTMZone.c_str()

标签: c++ types environment-variables


【解决方案1】:

getenv 返回一个char*。没有办法从char* 初始化char[N]。您需要做的是捕获指针,然后将字符串复制到数组中,如

char UTMZone[4];
char* ret = getenv("UTMZONE");
if (ret)
    strncpy(UTMZone, ret, 4);
else
    // abort

也就是说,如果您可以使用std::string,则可以从char* 构造。使用

char* ret = getenv("UTMZONE");
if (ret)
    std::string UTMZone = ret;
else
    // abort

给你一个填充了环境变量的字符串。如果您需要将它传递给需要char*const char* 的东西,那么您可以分别使用data()c_str() 成员函数。看起来像

function_that_needs_char_star(UTMZone.data());
function_that_needs_const_char_star(UTMZone.c_str());

【讨论】:

  • std::string UTMZone = getenv("UTMZONE"); 如果环境变量不存在会出现问题,因为getenv会返回NULL。
  • 您好,非常感谢您的回复和解释。你提到的两个选项都解决了这个问题。非常感谢!
  • 请注意,如果环境变量的长度至少为四个字符,那么您的后续代码很可能会出现未定义的行为。
  • @KerrekSB 已修复。
【解决方案2】:

如果你真的想使用一个字符数组并且确定你只需要 UTMZONE 的前三个字符,你可以使用这个:

char* envptr = std::getenv("UTMZONE");
if(envptr){ // check the pointer isn't null
  char UTMZone[4];

  // set null terminator
  UTMZone[4] = '\0';

  // copy 3 chars as the null terminator is already there
  std::strncpy(UTMZone, 3, envptr);
}

您应该真正使用字符串而不是 char[],因为它们更安全。


编辑:内森更快,更有说服力:(

编辑:调整为使用 strncpy 而不是 strcpy 并添加了 NULL 检查

【讨论】:

  • strncpy 会安全得多,而且还可以检查返回值。
  • 不确定 strcpy 会在没有找到 env var 的情况下传递空指针作为第二个参数会做什么(也许这就是 Bathsheba 已经指代的内容)
  • UTMZone[4] = '\0':不!这是缓冲区溢出(顺便说一句,它缺少分号)
  • 谢谢我错过了分号。你能解释一下这到底是怎么个缓冲区溢出吗?我为四个字符保留了空间,现在我用空终止符填充第四个字符,所以我看不到问题。
猜你喜欢
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多