比较const char *和strcmp的区别

3

我将一个 const char * 和一个字符串进行比较,但不知何故它总是成功。

    if (std::strcmp(t->detectColor->name, "ghghjg") != 0) {
        printf("XXXXXXXXXXX\n");
        // check if it was allready a sequencer
        if (std::strcmp(t->className, "IM_SURE_IT_CANT_BE_THIS") != 0) {
          printf("what is going on?\n");

探测颜色的名称通常是绿色或蓝色之类的,而t->className例如为“ofxDTangibleBase”。但仍然会打印出相应信息。
XXXXXXXXXXX
what is going on?

在控制台中,我如何获得有效的比较结果?


你睡得好吗?来自这篇帖子:https://dev59.com/-nA85IYBdhLWcg3wHvzB 这是一个相当容易犯的错误。 - clankill3r
2个回答

9
根据 cplusplus.com 的说明:

返回一个整数值,指示字符串之间的关系: 零值表示两个字符串相等。大于零的值表示第一个不匹配的字符在 str1 中具有比 str2 更大的值; 小于零的值则反过来。

或者用cppreference.com的话说:

返回值

  • 如果 lhs 小于 rhs,则为负数。
  • 如果 lhs 等于 rhs,则为 0。
  • 如果 lhs 大于 rhs,则为正数。
因此,在您的代码中,strcmp(t->detectColor->name, "ghghjg") 将返回与零不同的值。因此,将打印“XXXXXXXXXXX”。
您只需要更改:
if (std::strcmp(t->detectColor->name, "ghghjg") != 0)

to

if (std::strcmp(t->detectColor->name, "ghghjg") == 0)

同样适用于其他比较。


使用更好的cppreference进行引用。 - 4pie0
@piotruś:你是说这个引用有问题吗?在我看来它没问题,不过可能最好引用C标准而不是一些网站。 - Mike Seymour
@piotruś 我已经添加了你的引用。我使用cplusplus.com,因为他们通常是谷歌上的第一个结果,并且能胜任这份工作。 - Maxime Chéramy
谢谢,没想到在C++中比较如此先进 :) - clankill3r
2
@clankill3r:在C++中,您可以使用std::string并使用==进行比较。这只是因为您出于某种原因使用了C库而变得复杂。 - Mike Seymour
显示剩余3条评论

2
当字符串相同时,std::strcmp返回0;当字符串不同时,返回小于0或大于0的值。因此,你可以将代码更改为以下内容:
if (std::strcmp(t->className, "IM_SURE_IT_CANT_BE_THIS") != 0) {
  printf("indeed, strings are different\n");

如果lhs小于rhs,则为负值。 如果lhs等于rhs,则为0。 如果lhs大于rhs,则为正值。

http://en.cppreference.com/w/cpp/string/byte/strcmp


我该如何获得有效的比较?
if (std::strcmp(t->className, "IM_SURE_IT_CANT_BE_THIS") == 0) {
      printf("strings are equal lexicographically\n");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接