【问题标题】:How to test a "binary" or unset char*?如何测试“二进制”或未设置的 char*?
【发布时间】:2013-10-19 19:48:15
【问题描述】:

编辑:添加了一些对问题条件有很大变化的精度,请注意在判断答案之前。

我在const char* 表单下获得了一个环境变量。环境变量可以是

  • 未设置(我的意思是未设置,例如,如果环境变量取自批处理环境,set MyBinaryEnvVar=
  • 设置为 0
  • 设置为 1

因此,const char* 形式将是

  • ""
  • “0”
  • “1”

我想用一个单行来测试它,未设置和“0”未通过测试,“1”通过它。所以像:

if(getEnvVar("MyBinaryEnvVar")) {dontWorry();}
else {beHappy();}

getEnvVar 返回一个 const char* 。

在 VisualStudio 2010 上的测试表明 envVar 的三个值通过了测试,所以
if("") if("0") if("1") TRUE

谢谢

【问题讨论】:

  • 您在寻找ternary operator 吗?
  • 究竟什么是“未设置”?空字符串还是别的什么?
  • @CookieOfFortune 也许,我也不知道它在 char* 上的确切行为
  • @jrok 问题已更新
  • 我认为至少可以保留一个通用的、有用的信息,那就是如果非空 char* 为真。我认为如果我问起来,我会得到几个下降:p

标签: c++ if-statement char


【解决方案1】:

有关字符串比较,请参阅strcmp()getenv() 返回的所有值都是字符串。您只需要一个if 声明。

请注意,您的逻辑错过了“其他”情况(当值真正未设置时(即getenv() 返回NULL)或者它不是上述 3 个值。

【讨论】:

  • 我会推荐至少更安全的版本strncmp() 或使用std::string,因为OP 要求c++
  • 我不能使用 strcmp(公司限制) 我的 getenv 不返回字符串,而是返回 const char,如所示。我正在澄清问题中的 Unset/null 案例,谢谢
  • @Kharski const char* 是 C 风格的字符串。还是您的意思是const char(返回单个char 是一种奇怪的方式)?
  • @simonc 是 C 风格的字符串。如果您认为我应该重新标记为 C 而不是 C++,请添加一个带有理由的 meta.SO 链接,我会这样做。
【解决方案2】:

假设getEnvVar 可以为未设置的值返回 NULL,那么您无法有效地同时检查 NULL 并在一行中比较一个值。

假设您会做很多这样的事情并想要一种简洁的方式,您可以将这两个操作委托给一个新函数并将其作为单线调用:

bool isVarSet(const char* var)
{
    const char* val = getEnvVar("MyBinaryEnvVar");
    if (val != NULL && strcmp(val, "1") == 0) {
        return true;
    }
    return false;
}

if(isVarSet("MyBinaryEnvVar")) {dontWorry();}
else {beHappy();}

另一方面,如果getEnvVar 为未设置的值返回一个空字符串"",您可以这样做

if(strcmp(getEnvVar("MyBinaryEnvVar"), "1") == 0) {dontWorry();}
else {beHappy();}

【讨论】:

  • 目前最好的答案。对于第二部分,我不能使用 strcmp
  • 验证你的答案,我必须找到一个等效的 strcmp。
  • @Kharski 很高兴答案很有帮助。您能否确认您无法使用strcmp 的原因?如果需要,编写自己的版本将是微不足道的,但我正在努力思考可以有效禁止所有使用 C 标准库的公司政策......
  • 别再想了! Dassault Systemes,是的,是的,法国最大的软件编辑器。我要辞职了,明天正常。但我不得不说,普遍禁止所有第三方软件确实有一个很好的理由:你依赖别人。他们可以更改他们的许可,破坏他们的代码等。虽然我不明白为什么他们不能坚持使用旧版本,但在这些情况下,如果依赖项很有可能完美无缺,这是可以的,就像标准库。但在实践中,很多内部开发的东西都不是很好,有时根本就没有。
  • strcmp 并不是真正的第三方软件。它是 C 标准库的一部分,它本身随您的操作系统和/或编译器一起提供。您的(不久前的)雇主必须编写自己的包含标准库的 OS+编译器,或者使用包含标准库实现的第三方版本。换句话说,如果你可以打电话给malloc,我还以为你可以打电话给strcmp
猜你喜欢
  • 1970-01-01
  • 2021-04-18
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多