我如何比较base36值在c++
How do I compare base36 values in C++?
我们都知道,对于c风格的字符串比较,其值依赖于每个字符的ASCII值,只使用strcmp
函数进行比较。我很困惑,std::string
比较取决于什么?
虽然我已经在Google上搜索了,但我仍然没有找到答案。
另外,如果字符串都是base36字符串,它们都是小写的,我可以直接通过字符串比较它们的值吗?或者我应该用strtol
函数把它们转换成一个长变量?哪种方法更好?
您的开头"众所周知,使用c风格的字符串比较,值取决于每个字符的ASCII值…"不幸的是已经错误了。例如,对于UTF-8字符串和各种形式的排序,这是不正确的。
然后"…也是错误的,因为c风格的字符串没有固有的比较方式,而是多种方式,也依赖于例如编码和区域设置。您可以使用strcmp()
进行字节相等比较,但这并不总是给您预期的结果。
回答你的问题std::string
使用什么,这很简单。std::string
是std::basic_string
模板的专门化,它将比较委托给它的char_traits
模板参数。该参数通常使用memcmp()
。它不可能使用strcmp()
,因为除了c风格的字符串,std::string
可以包括空字符,但strcmp()
将停止在那些。
std::string compare依赖于'ASCII值',与strcmp完全相同。
对于base36比较,简单的字符串比较(strcmp或std::string)不起作用,因为"00123"answers"123"在表示base36整数时是相等的,但它们作为字符串进行比较时不同。由于整数溢出,strtol也不能很好地工作。相反,您可能应该编写自己的比较例程,删除前导零,然后比较长度,最后对长度相等的字符串进行字符串比较。
- 当 I2C 值在C++中发生变化时收到通知
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 如何在比较时更改集合元素的值(在 c++ 中)?
- "this"指针的值在对象的生存期内是否恒定?
- std::tuple 可以根据其值在编译时/运行时排序吗?
- cppcheck 抱怨危险地使用 c_str(). c_str() 返回的值在此调用后无效
- cpp 检查抱怨危险使用 c_str(). c_str() 返回的值在本次调用后无效,如何解决?
- 为什么这个 x 值在这个循环映射中没有增加?C++
- 为什么双精度引用值在分配给C++中的浮点变量时不会更改
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 返回布尔值在 cocos2dx 的 onTouchBegan() 中是什么意思?
- 如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?
- 第二个和第二个最终值在 C++ 中混合在二维数组中
- 右移布尔值在C++
- 警告 C6031 返回值在宏扩展中被忽略
- 为什么两个程序中的总和值在最后不同?
- 矢量的值在不应该更改时更改
- 二进制文本,其值在编译时以 C++ 为单位确定
- 我如何比较base36值在c++