c - 有没有一种简单、可移植的方法来确定 C 中两个字符的顺序?

标签 c language-lawyer

根据标准:

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/

相关文章:

c++ - using namespace std 的排序;包括?

c++ - 用户定义的转换是否将派生类类型转换为基类类型?

c++ - 下面的初始化是如何良构的?

c - 抓取 "A="和 "&"之间的值,但即使 "&"不存在

c - 尝试从 recv() 字符数组解析十进制 dstAddr.sin_addr.s_addr

C++ 声明顺序(在多变量声明行中)

c# - 从 IEnumerable 转换为 IEnumerable<object>

python - 将字符串作为资源嵌入

c - 拥有 .bss 部分有什么好处?

c - 为什么我的键盘记录器不起作用?