如何比较C ++中的base36值?

时间:2015-08-20 04:52:59

标签: c++

众所周知,使用C风格的字符串比较,该值取决于每个字符的ASCII值,只使用strcmp函数进行比较。我很困惑std::string比较取决于什么?

虽然我搜索了Google,但我仍然没有找到答案。

另外,如果字符串都是base36字符串并且它们都是小写的,我可以直接用字符串比较它们的值吗?或者我应该使用strtol函数将它们转换为长变量?哪种方法更好?

2 个答案:

答案 0 :(得分:2)

您的开始"众所周知,使用C风格的字符串比较,该值取决于每个字符的ASCII值..."不幸的是已经错了。用例如UTF-8字符串和各种形式的整理,这简直是不真实的。

然后" ...并且只使用strcmp函数进行比较。"也是错误的,因为C风格的字符串没有固有的比较方式,但多种方式也取决于例如编码和语言环境。您可以使用strcmp()进行逐字节相等比较,但不会总是给您预期的结果。

要回答std::string使用的问题,那很简单。 std::stringstd::basic_string模板的特化,它将比较委托给其char_traits模板参数。此参数通常使用memcmp()。它不可能使用strcmp(),因为除了C风格的字符串之外,std::string可以包含空字符,但strcmp()会停在那些字符处。

答案 1 :(得分:1)

std :: string compare取决于' ASCII值'与strcmp完全相同。

对于base36比较,简单的字符串比较(strcmp或std :: string)不起作用,因为" 00123"和" 123"在表示base36整数时是相等的,但它们作为字符串的比较不同。由于整数溢出,strtol也不能很好地工作。相反,您应该编写自己的比较例程来删除前导零,然后比较长度,最后对于相等长度的字符串进行字符串比较。