根据标准:
The values of the members of the execution character set are implementation-defined.
(ISO/IEC 9899:1999 5.2.1/1)
进一步在标准中:
...the value of each character after
0
in the above list of decimal digits shall be one greater than the value of the previous.
(ISO/IEC 9899:1999 5.2.1/3)
标准似乎要求执行字符集包括拉丁字母的 26 个大写字母和 26 个小写字母,但我认为这些字符没有任何排序要求。我只看到小数位的顺序规定。
这似乎意味着,严格来说,不能保证 'a' < 'b'
.现在,字母表中的字母在 ASCII、UTF-8 和 EBCDIC 中都是按顺序排列的。但是对于 ASCII 和 UTF-8,我们有 'A' < 'a'
, 而对于 EBCDIC 我们有 'a' < 'A'
.
在 ctype.h
中有一个函数可能会很好可移植地比较字母字符。缺少这个或类似的东西,在我看来,必须查看语言环境才能找到 CODESET
的值。并据此进行,但这似乎并不简单。
我的直觉告诉我这几乎不是问题;在大多数情况下,字母字符可以通过转换为小写来处理,因为对于最常用的字符集,字母是按顺序排列的。
问题:给定两个字符
char c1;
char c2;
是否有一种简单、便携的方法来确定 c1
是否存在?先于 c2
按字母顺序?或者我们是否假设小写和大写字符总是按顺序出现,即使标准似乎不能保证这一点?
为了澄清任何混淆,我真的只对标准保证在执行字符集中的 52 个拉丁字母感兴趣。我意识到其他字母组很重要,但似乎我们甚至不知道这一小部分字母的顺序。
编辑
我想我需要再澄清一点。在我看来,问题在于我们通常认为拉丁字母表中的 26 个小写字母是有序的。我希望能够断言“a”出现在“b”之前,我们有一种方便的方式在代码中将其表达为 'a' < 'b'
,当我们给出 'a' 和 'b' 整数值时。但该标准不保证上述代码将按预期进行评估。为什么不?该标准确实保证了数字 0-9 的这种行为,这似乎是明智的。如果我想确定一个字母字符是否在另一个字母字符之前,例如出于排序目的,并且如果我希望此代码真正可移植,那么标准似乎没有提供任何帮助。现在我必须依赖 ASCII、UTF-8、EBCDIC 等已经采用的约定 'a' < 'b'
应该是真的。但这并不是真正可移植的,除非使用的唯一字符集依赖于此约定;这可能是真的。
这个问题源于另一个问题线程:Check if a letter is before or after another letter in C .在这里,一些人建议您可以确定存储在 char
中的两个字母的顺序。使用不等式。但一位评论者指出,标准并不能保证这种行为。
最佳答案
strcoll 就是为此目的而设计的。只需设置两个字符串,每个字符串一个字符。 (通常你想比较字符串,而不是字符)。
关于c - 有没有一种简单、可移植的方法来确定 C 中两个字符的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39924464/