我如何比较base36值在c++

How do I compare base36 values in C++?

本文关键字:base36 值在 c++ 比较 何比较      更新时间:2023-10-16

我们都知道,对于c风格的字符串比较,其值依赖于每个字符的ASCII值,只使用strcmp函数进行比较。我很困惑,std::string比较取决于什么?

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

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

您的开头"众所周知,使用c风格的字符串比较,值取决于每个字符的ASCII值…"不幸的是已经错误了。例如,对于UTF-8字符串和各种形式的排序,这是不正确的。

然后"…也是错误的,因为c风格的字符串没有固有的比较方式,而是多种方式,也依赖于例如编码和区域设置。您可以使用strcmp()进行字节相等比较,但这并不总是给您预期的结果。

回答你的问题std::string使用什么,这很简单。std::stringstd::basic_string模板的专门化,它将比较委托给它的char_traits模板参数。该参数通常使用memcmp()。它不可能使用strcmp(),因为除了c风格的字符串,std::string可以包括空字符,但strcmp()将停止在那些。

std::string compare依赖于'ASCII值',与strcmp完全相同。

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