【问题标题】:use of strcmp in code, compile->test->fails, debug, realize I forgot 0==strcmp [closed]在代码中使用 strcmp,编译->测试->失败,调试,实现我忘记了 0==strcmp [关闭]
【发布时间】:2012-09-10 18:57:57
【问题描述】:

我只是对 strcmp、stricmp、比较等有某种基本的感知问题。我知道他们做什么,我知道他们为什么这样做,但是当我检查相等性时,我只是自然地写“if (strcmp( ) )..." 这对我来说是逆向逻辑,我只是​​没有想到(直到后来我的代码块不起作用)写“if (0==strcmp())...”。我一直这样做,它减慢了我的发展。有没有人可以在这方面扭转我的想法?

就像我需要将函数命名为“strdoesntcmp”...(是的,我知道它不能用于小于或大于这种方式...)。当然我可以使用 #define 或 inline 来做这样的事情,但那是一个 hack……如果这有意义的话,我只想扭转我对它的自然想法……

【问题讨论】:

  • 所以您希望有人侵入您的思维并改变您的思维方式?嘭!
  • 哈哈,我正要发帖哈哈哈
  • 不要写(0 == whatever)。这是不直观的;反过来写,也许你会记得更清楚。 (“如果差为零”)。
  • 好吧,你已经把它标记为 C++,所以我会说使用 C++ 字符串工具......但说真的,选择一种语言。它们不一样。
  • @mark 但您通常会将== 运算符与 std::string 一起使用

标签: c++ c string


【解决方案1】:
int streq( char const* s1, char const* s2)
{
    return 0 == strcmp(s1, s2);
}

inline 如果性能开销困扰您。

【讨论】:

  • 他想学习“方法”,而不是发明解决方法。 :)
  • str 开头的外部标识符保留供将来使用,因此也许应该考虑为这个辅助函数使用一个替代名称。
  • @eq- strxxx 被保留很有趣...
【解决方案2】:

最好的答案是完全忘记strcmp

std::string s1 = "one";
std::string s2 = "two";
if (s1 == s2) // ...

编辑:如果您熟悉汇编,strcmp 函数根本不会让您感到困惑。许多处理器都有一个CMP 指令,该指令执行两个值的减法而不存储结果,它只是设置条件标志,告诉您结果是负数、零还是正数。 strcmp 只是用字符串模拟同样的事情。

【讨论】:

  • 我确实开始在某一时刻对 std::strings 使用该约定,但它当然不适用于 const char * 情况,而且缺乏 stricmp 和 strncmp 能力阻碍了我“接受”它作为我的主要约定......
  • @mark: "但它在 const char * 情况下当然不起作用" 谁说的? if (s1 == "three")?听起来您需要发现Boost。它会消除很多样板。
  • @mark - 您可以覆盖 basic_string 中的 char_traits,std::string 是其实例化,并且不区分大小写。或者,您可以在 c_str() 返回时调用旧的 C 函数。
  • 我不是从头开始一个项目,我在一个混合使用 C/C++ 字符串的大型项目中......将 Boost 投入其中,而不是机会。当两个字符串都是 const char * 时,我不能使用 std:string (不支付创建一个的惩罚)......在该示例中至少需要一个,这也是假设我们不比较大小写-不敏感或对 n 字符不敏感。无论如何,就像我说的那样,我正在寻找某种心态重置...
  • @mark,你可以随时构建其中一个字符串:if (std::string("one") == "two")。而且我没有看到任何关于提升的建议,我不知道你为什么提出它。
【解决方案3】:

试想一下,这种比较实际上就是减法(微处理器指令也以这种方式工作)。所以strcmp 可能会被称为strsub,这样零就意味着字符串相等。

或自行实现strcmp 规范。当你计算出来时,返回值会像1x1一样粘在你的脑海里。

您也可以想,一旦您发布到 stackOverflow,您总是会忘记 (0==strcmp) 并得到很多令人困惑的答案。记住这一点后,您就不会再误认为 compare 运算符不是 equality 运算符了。

【讨论】:

  • 我喜欢“减法”或“差异”的类比...
  • 首先,感谢您回答我提出的问题,即“我需要另一种看待它的方式”。在睡觉之后,我认为这对我有用......每次我使用 strxxx 函数时,我都会想到“strdiff”......即如果“差异”为零,它们是相同的。我可能会创建一个 strdiff 内联,但可能不会使用它,因为其他人查看/编辑我的代码会不直观。谢谢!
【解决方案4】:

它不像您希望的那样直观的原因是您想使用它来比较字符串 == 或 !=。这不是 strcmp 函数的全部意义。关键是它可以返回str1 > str2str1 == str2str1 < str2,您可以出于不同的原因使用这些不同的返回。

如果您真的无法将它们直接记在脑海中,并且您使用此功能进行 == 或 != 类型的配对,您可以随时自行反转它:

#define strcmp !strcmp

然后它会按照你想要的方式工作,但正如我所提到的,你这样做会失去功能。

【讨论】:

  • 这样做你也会失去理智。 :o
  • 我宁愿自己制作包装它的函数。往下看,我想这是有人建议的:p
  • 买家小心。 :) 我从来没有说过这是一个的想法,只是它会让它像 OP 想要的那样“工作”。
  • 否;它可能会修复一个错误条件,但即使在 OP 的情况下也很容易破坏现有代码(因为他暗示他也可能使用strcasecmp;他也可以很好地使用指向它们的函数指针)
  • 确实,灾难会发生……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2013-11-16
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多