c++ - strcmp() 但在 A-Z 之后是 0-9? (C/C++)

标签 c++ c strcmp lexicographic

出于我完全不同意但“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/

相关文章:

在arm gcc中控制函数的prelog和epilog

c - 在C编程中使用 "fgetc"从PPM文件中找到RGB总和(0)的最小值?

c - 与不相等的字符串比较时,strcmp() 返回 0

c - strcmp 的段错误(核心转储)错误

java - Java 运行时环境 : OpenCV ellipse detection in Java 检测到 fatal error

c++ - C++ 中的函数默认参数

c++ - 串行编程(硬件握手)

c - strcmpi 代码不会编译但 strcmp 会?

c++ - 类局部特化继承方法

c++ - 我怎样才能优化它以有效的方式运行?