【问题标题】:What is the proper function for comparing two C-style strings?比较两个 C 风格字符串的正确函数是什么?
【发布时间】:2012-02-25 16:16:48
【问题描述】:

所以我进退两难了。我需要比较两个 C 风格的字符串,然后搜索最合适的函数:

memcmp   //Compare two blocks of memory (function)
strcmp   //Compare two strings (function )
strcoll  //Compare two strings using locale (function)
strncmp  //Compare characters of two strings (function)
strxfrm  //Transform string using locale (function)

我认为第一个是地址,所以这个想法已经出来了。 第二个听起来对我来说是最好的选择,但我还是想听听反馈。 其他三个让我一无所知。

【问题讨论】:

  • “我认为第一个用于地址” - 不,它用于任意内存块。最后,所有这些函数都获取指向要比较的内存块的地址。但实际上没有一个比较地址。但是从您的代码内 cmets 我猜您已经意识到了这一点,只是表达得有些不准确。

标签: c++ c string compare


【解决方案1】:

对于一般的字符串比较,strcmp 是合适的函数。您应该使用 strncmp 仅比较字符串中的某些字符(例如,前缀),并使用 memcmp 比较内存块。

也就是说,由于您使用的是 C++,因此您应该完全避免这种情况并使用 std::string 类,它比 C 风格的字符串更易于使用且通常更安全。只需使用 == 运算符,您就可以轻松比较两个 std::strings 是否相等。

希望这会有所帮助!

【讨论】:

  • 谢谢,我很乐意,但现在我们的教授限制我们只能使用 C 字符串。
  • @ingcarlos- 你是正确的,你不应该在这里使用 ==。我的建议是切换到 C++ 的 std::string,在这种情况下 == 运算符是可行的方法。
【解决方案2】:

memcmpstrcmp 都可以正常工作。要使用前者,您需要提前知道较短字符串的长度。

【讨论】:

  • 如果你用前一个字符串的长度调用memcmp,那么它会告诉你"abc""abcdef"是相等的。您可以将较短字符串的长度加一传递给它(它会看到并比较 '\0' 终止符)——但由于 strcmp 专门用于比较字符串,所以您应该使用它。
  • 我同意所有这些,是的。
  • 有人知道memcmp 是否可以更快,比如因为提前知道长度,因此可以通过在第一个实例中查看字长块来进行一些优化?
  • @Keith:也许,也许不是。信任您的运行时库并使用意味着您想要的功能。不要试图智取编译器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多