【问题标题】:Strcmp not working, even when comparing the same characterstrcmp 不起作用,即使比较相同的字符
【发布时间】:2020-04-03 05:50:39
【问题描述】:

我很困惑。我正在开发一个需要使用 strcmp 的项目,但它似乎根本不起作用。上面你在 gdb 中看到了一个例子,其中两个字符被认为是不相等的。当我比较我的两个 char 数组时,显然结果相似。此外,当我将数组与它们自身进行比较时,我也会得到错误(上面的名称是 char[8])。当我在同一个数组上的代码中运行 strcmp 时,它会产生正确的结果,但不会在 gdb 中(见第三张图片)我只需要在哪里查看/做什么。

谢谢。

编辑:图片中的两个代码片段:

print strcmp("S", "S")==0
print strcmp(name, name)==0

【问题讨论】:

  • 你的截图中有那些单引号吗? (旁注:最好将文本发布为文本,而不是图形,特别是这样文本可以更容易查看和验证)。如果它们是单引号,那么很可能strcmp() 没有被正确调用——它期望它的参数是const char * 类型,而不是char。因此,请尝试使用双引号(例如 print strcmp("S", "S") == 0
  • C != C++。请选择一个
  • 一个函数没有足够的参数,另一个有未知的参数...
  • 而且你一直在移动代码而不将其作为文本发布......
  • @A.Smith 我刚刚在gdb 中运行print strcmp(name,name)==0 并得到1。因此,除非我们了解您和我的设置之间有什么不同,否则我们无法帮助您。请提供您的源代码以及有关编译器和系统的信息。

标签: c++ c arrays string strcmp


【解决方案1】:

您使用了错误的引号。

strcmp 函数期望两个参数都是const char * 类型,即指向空终止字符串的指针。在 C++(和 C)中,单引号用于单个字符,而双引号用于以空字符结尾的字符串。所以你没有传递正确类型的参数。

进行这种比较的正确方法是:

strcmp("S", "S") == 0

【讨论】:

  • @A.Smith 您现在正在调用不同的函数,并且参数数量错误。
  • 你说你得到了错误的输出,但它是不可能重现的。我刚刚运行了这个确切的函数并得到了true...所以除非你共享代码的相关部分,否则我们只能假设错误是你的代码而不是这个函数。
  • @calvinBroadus 我只是觉得运行这段代码会让你头疼,所以我把它省略了。不过我把它放了。
  • @A.Smith 很头疼。这就是为什么minimal reproducible example 中有“最小”这个词的原因。您应该从代码中删除不相关的部分(但始终保持运行),直到问题仍然存在
  • @calvinBroadus gdb 对 strcmp 的评估可能会在调试 C++ 程序时返回垃圾,如果 strcmp 被优化。这导致print strcmp(name, name) 返回随机值,可能是0,也可能不是。因此,OP 将他的错误误认为是在尝试评估函数以指示函数操作中的错误。
【解决方案2】:

当字符串相等时 strcmp 返回 0 , false ,我认为您期望 1 , true 。但就是这样。您可以将其包装在您自己的函数中,并且您的函数可以返回 true。

【讨论】:

  • strcmp 的常见问题是当字符串末尾有一个 \n 时,请注意它,或者字符串开头有一个空白。
猜你喜欢
  • 1970-01-01
  • 2016-08-05
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多