C++ 在代码中使用strcmp,编译->测试->失败,调试,实现我忘记了0==strcmp

C++ 在代码中使用strcmp,编译->测试->失败,调试,实现我忘记了0==strcmp,c++,c,string,C++,C,String,我只是对strcmp,stricmp,compare等有一些基本的感知问题。我知道他们做什么,我知道他们为什么这么做,但当我检查平等性时,我只是自然而然地写下如果strcmp。。。对我来说,这是一种反向逻辑,直到后来当我的代码块在0==strcmp….时无法写入时,我才会想到这一点。。。。我总是这样做,这会减慢我的发展。有人能给我一个建议让我改变主意吗 好像我需要将函数命名为strdoesntcmp。。。是的,我知道它不能用在比这种方式少或多的地方。。。。当然,我可以使用define或inlin

我只是对strcmp,stricmp,compare等有一些基本的感知问题。我知道他们做什么,我知道他们为什么这么做,但当我检查平等性时,我只是自然而然地写下如果strcmp。。。对我来说,这是一种反向逻辑,直到后来当我的代码块在0==strcmp….时无法写入时,我才会想到这一点。。。。我总是这样做,这会减慢我的发展。有人能给我一个建议让我改变主意吗


好像我需要将函数命名为strdoesntcmp。。。是的,我知道它不能用在比这种方式少或多的地方。。。。当然,我可以使用define或inline来制作这样的东西,但这是一个hack。。。如果这有意义的话,我只想改变我对它的自然思考…

最好的答案是完全忘记strcmp

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

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

最好的答案是完全忘记strcmp

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

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

想想看,这种比较实际上是对微处理器指令的一种简化,它们也是以这种方式工作的。所以strcmp可以称为strsub,以这种方式,零表示字符串相等

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


您还可以认为,一旦您发布到stackOverflow,您总是忘记了0==strcmp,并得到了许多令人困惑的答案。一旦你记住了这一点,你的大脑就不会再犯比较运算符不是相等运算符的错误了。

想想看,比较实际上是一种微积分运算,微处理器指令也是这样工作的。所以strcmp可以称为strsub,以这种方式,零表示字符串相等

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

您还可以认为,一旦您发布到stackOverflow,您总是忘记了0==strcmp,并得到了许多令人困惑的答案。一旦你记住了这一点,你的大脑就不会再犯比较运算符不是相等运算符的错误了

如果性能开销困扰您,请将其内联


如果性能开销困扰您,请将其内联。

之所以不像您希望的那样直观,是因为您希望使用它来比较字符串==或!=。这不是strcmp功能的全部要点。关键是它可以返回str1>str2、str1==str2或str1 如果你真的不能让它们在你的脑海中清晰地出现,你只能用这个函数来做==或!=键入compairions,您随时可以自己将其反转:

#define strcmp !strcmp

然后它按您希望的方式工作,但正如我所提到的,这样做会失去功能。

它不像您希望的那样直观,是因为您希望使用它来比较字符串==或!=。这不是strcmp功能的全部要点。关键是它可以返回str1>str2、str1==str2或str1 如果你真的不能让它们在你的脑海中清晰地出现,你只能用这个函数来做==或!=键入compairions,您随时可以自己将其反转:

#define strcmp !strcmp

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

那么你希望有人侵入你的思维,改变你的思维方式?Bwong!哈哈,我刚想发个帖子,哈哈哈,别写0==随便什么。这是不直观的;反过来写,也许你会记得更清楚。如果差异是零。那么你就得到了C++的标记,所以我会说使用C++字符串工具……但是,认真地,选择一种语言。它们不一样。@马克,但你通常会在std::string中使用==运算符,所以你希望有人侵入你的思想,改变你的思维方式?Bwong!哈哈,我刚想发个帖子,哈哈哈,别写0==随便什么。这是不直观的;反过来写,也许你会记得更清楚。如果差异是零。那么你就得到了C++的标记,所以我会说使用C++字符串工具……但是,认真地,选择一种语言。它们不一样。@马克,但你通常会使用

==带std::string的运算符我确实在某一点上开始对std::string使用该约定,但它当然在const char*情况下不起作用,而且还缺少stricmp和strncmp功能,这阻碍了我接受它作为我的主要约定…@mark:但它在const char*情况下不起作用,当然是谁说的?如果s1=三?听起来你需要去发现。它会让很多锅炉板被挡在一边。@mark-你可以覆盖基本字符串中的字符特征,std::string是基本字符串的一个实例,并且不区分大小写。或者,您可以在返回C_str时调用旧的C函数。我不是从头开始一个项目,我在一个混合使用C/C++字符串的大型项目中。。。给它注入动力,而不是机会。当两个字符串都是const char*…时,如果不付出创建一个字符串的代价,我就不能使用std:string。。。在这个例子中至少需要一个,这也是假设我们没有比较大小写不敏感或n字符。不管怎样,就像我说的,我正在寻找某种思维重置…@mark,你总是可以动态构造一个字符串:if std::stringone==two。我还没有看到任何关于boost的建议,我不知道你为什么要提出它。我确实曾经开始在std::string中使用该约定,但它在const char*情况下不起作用,当然,此外,还缺乏stricmp和strncmp的能力,这阻碍了我接受它作为我的主要惯例…@马克:但它在const char*情况下不起作用,当然是谁说的?如果s1=三?听起来你需要去发现。它会让很多锅炉板被挡在一边。@mark-你可以覆盖基本字符串中的字符特征,std::string是基本字符串的一个实例,并且不区分大小写。或者,您可以在返回C_str时调用旧的C函数。我不是从头开始一个项目,我在一个混合使用C/C++字符串的大型项目中。。。给它注入动力,而不是机会。当两个字符串都是const char*…时,如果不付出创建一个字符串的代价,我就不能使用std:string。。。在这个例子中至少需要一个,这也是假设我们没有比较大小写不敏感或n字符。不管怎样,就像我说的,我正在寻找某种思维重置…@mark,你总是可以动态构造一个字符串:if std::stringone==two。我还没有看到任何关于boost的建议,我不知道你为什么要提起它。你这样做也会失去理智我宁愿做我自己的函数来包装它。往下看,我想有人建议:购买者要当心我从来没有说过这是一个好主意,只是说它会使它按照OP的要求工作;它可能会修复一个单一的错误情况,但即使在OP的情况下也可以轻易地破坏现有代码,因为他暗示他可能也在使用strcasecmp;他可以很好地使用函数指针指向它们,事实上,灾难会发生……这样做也会让你失去理智我宁愿做我自己的函数来包装它。往下看,我想有人建议:购买者要当心我从来没有说过这是一个好主意,只是说它会使它按照OP的要求工作;它可能会修复一个单一的错误情况,但即使在OP的情况下也可以轻易地破坏现有代码,因为他暗示他可能也在使用strcasecmp;他可以很好地使用函数指针指向它们,事实上,灾难会发生……他想学习方法,而不是发明一种解决方法从STR开始的外部标识符被保留以供将来使用,因此人们应该考虑使用这个辅助函数的替代名称。@ EQ-这是有趣的关于SRXXX被保留的……他想学习方法,而不是发明一种解决方法。从STR开始的外部标识符保留为将来使用,所以也许应该考虑使用这个辅助函数的替代名称。@ eq-这是有趣的关于SRXXX被保留…我喜欢减法或差类比…首先,谢谢回答我问的问题,我需要另一种方式来看待它。睡了一觉后,我想这对我会有用的。。。每次我使用strxxx函数时,我都会认为strdiff。。。i、 如果差值为零,则它们是相同的。我可能会创建一个strdiff内联,但可能不会使用它,因为它对其他人查看/编辑我的代码不敏感。谢谢我喜欢减法或差分类比……首先,谢谢你回答我的问题,我需要另一种方式来看待它。睡了一觉后,我想这对我会有用的。。。每次我使用strxxx函数时,我都会认为strdiff。。。i、 如果差值为零,则它们是相同的。我可能会创建一个strdiff内联,但可能不会使用它,因为它对其他人查看/编辑我的代码不敏感。谢谢