【问题标题】:Strict Weak Ordering of "i" and "Love"“i”和“Love”的严格弱序
【发布时间】:2021-12-04 06:53:56
【问题描述】:

假设:: 当 a 在 b 之前时,a

代码

std::string a = "i";
std::string b = "Love";
std::cout << "(a < b) = " <<  ((a < b) ? "true" : "false");

输出

(a < b) = false 

我们知道“i”在“Love”之前,那么为什么上面的代码返回 false?
我最初的假设是错误的吗?
感谢您的帮助。

【问题讨论】:

  • 不要为 C++ 问题标记 C。
  • "...我们知道 "i" 先于 "Love" ..." 你可能想检查这个假设 - en.cppreference.com/w/cpp/language/ascii
  • 你要的关键字是“不区分大小写比较”
  • C++ 语言中不要求表示字符“i”的值小于表示字符'L' 的值。事实上,编译器使用的字符编码似乎正好相反。字符集的唯一语言要求是字符'0' .. '9' 的值必须相邻且递增。这使您可以通过 ch - '0' 将数字字符转换为该字符所代表的值。

标签: c++ string


【解决方案1】:

在 ASCII 中,大写字母要早于小写字母。您可以通过std::cout &lt;&lt; (int)'L' &lt;&lt; ' ' &lt;&lt; (int)'i'; 打印其值

【讨论】:

  • 但是有2个字符串的比较,所以肯定有operator
  • @korzck:编译器接受 a &lt; b 并且程序运行的事实意味着表达式在语法上被接受并且执行了某些操作,但这并不意味着表达式 有效以产生所需的结果。
【解决方案2】:

在 C++ 实现使用的字符编码中,小写“l”的字符代码比大写“L”高。大多数 C++ 实现目前使用 ASCII 来表示字符 A-Z 和 a-z。在ASCII中,“L”的代码是76,“i”的代码是105。

要查看 C++ 实现用于字符的代码,可以将它们转换为 int 并打印出来。下面是一个使用字符常量的例子:

std::cout << static_cast<int>('i') << '\n'; // Will print 105 in implementations that use ASCII.

对于字符串字面量和一般字符串,您可以使用下标选择单个字符:

std::cout << static_cast<int>("Love"[0]) << '\n'; // Will print 76 in implementations that use ASCII.

当您想比较单个字符忽略大小写时,您可以使用touppertolower(在&lt;cctype&gt; 中声明)将两个字符转换为相同的大小写进行比较:

std::cout << (tolower(a[0]) < tolower(b[0]) ? "true" : "false") << '\n';

要对字符串执行此操作,您可能需要编写额外的代码;我不知道标准 C++ 库中有不区分大小写的字符串比较。

【讨论】:

    【解决方案3】:

    其他用户已经指出,在最常见的字符编码(即:ASCII 和 Unicode)中,小写字母 inot 在大写字母 L 之前。阅读有关ASCIIthe difference between lower- and upper-case letters 的更多信息。

    我想补充一点,如果你想在不关心字母大小写的情况下进行比较(这样i 就像你想要的那样在L 之前),你可以使用特定的函数,比如符合 POSIX 的 @987654323 @。 See also other methods to compare strings ignoring the case.

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 2010-11-02
      • 2013-02-14
      • 2010-11-20
      • 2013-03-27
      • 1970-01-01
      • 2019-06-09
      • 2016-02-04
      • 2015-09-20
      相关资源
      最近更新 更多