出于我完全不同意但“The Powers (of Anti-Usability) That Be”的原因,尽管我反对,但它继续颁布,我有一个排序例程,它执行基本的 strcmp() 比较以按其名称排序。效果很好;很难弄错那个。然而,在第 11 个小时,已经决定以数字开头的条目应该出现在以字母开头的条目之后,这与 ASCII 顺序相反。他们引用 EBCDIC 标准有数字跟在字母后面,所以先前的假设不是普遍真理,我没有能力赢得这场争论……但我离题了。
这就是我的问题。我已经用新函数调用 nonstd_strcmp 替换了对 strcmp 的所有适当引用,现在需要实现修改以完成排序更改。我使用 FreeBSD 源作为我的基础:http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/libkern/strncmp.c.html
if (n == 0)
return (0);
do {
if (*s1 != *s2++)
return (*(const unsigned char *)s1 -
*(const unsigned char *)(s2 - 1));
if (*s1++ == 0)
break;
} while (--n != 0);
return (0);
我想我可能需要花一些时间来真正考虑应该如何完成,但我确信我不是唯一经历过发布前规范更改的大脑死亡的人。
最佳答案
您需要做的是为每个字符创建一个排序表。这也是进行不区分大小写比较的最简单方法。
if (order_table[*s1] != order_table[*s2++])
请注意,字符可能已签名,在这种情况下,您的表的索引可能会变为负值。此代码仅适用于签名字符:
int raw_order_table[256];
int * order_table = raw_order_table + 128;
for (int i = -128; i < 128; ++i)
order_table[i] = (i >= '0' && i <= '9') ? i + 256 : toupper(i);
关于c++ - strcmp() 但在 A-Z 之后是 0-9? (C/C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3049123/