【问题标题】:What is the ordering for `strcmp`'s return value?`strcmp` 的返回值的顺序是什么?
【发布时间】:2015-02-04 22:30:21
【问题描述】:

我的代码量很少:

int test = strcmp("Websecurity", "easily");
printf("%d\n", test);

结果是-1。为什么?显然'W'大于'e'?

【问题讨论】:

  • 是什么让您认为W 大于e?如有疑问,您可以尝试打印相关字符的数值。
  • 查看你的库是否支持 strcmpi() 或 stricmp()。
  • 我不明白为什么误解需要积极的反对。如果这个问题是在 4 年前提出的,它会得到 100 票。
  • 很明显,您对strcmp() 的工作原理有误解。除非您将代码集标识为 EBCDIC(其中 az 被编码为 0x81..0xA9,有间隙,而 AZ 被编码为 0xC1..0xE9),您的假设是错误的。
  • @BrettHale 一方面,这本身并不是一个坏问题。另一方面,再次阅读strcmp 的文档就足够了。

标签: c string strcmp


【解决方案1】:

在 ASCII 中,大写字母位于小写字母之前,因此 'W' < 'e'

【讨论】:

  • 严格来说,这应该用类似“在大多数常见代码集中,例如基于 ASCII 的代码集(包括 ISO 8859-x 系列代码集和 Unicode,以及许多Windows 代码页),大写字母在小写字母之前,因此'W' < 'e'strcmp() 的返回值应该是负数(值的大小未定义)”。但这将细微差别应用于可接受的答案。请注意,EBCDIC 是一个例外,其中 az 编码为 0x81..0xA9,有间隙,AZ 编码为 0xC1..0xE9。
【解决方案2】:

strcmp 的返回值取决于被比较字符串的编码。根据 Posix 标准:

发件人:http://pubs.opengroup.org/onlinepubs/009695399/functions/strcmp.html

非零返回值的符号应由在被比较的字符串中不同的第一对字节(均解释为类型无符号字符)的值之间的差异符号确定。

在 ASCII(和 utf-8)中,大写字母由比小写字母低的字节值表示。特别是,“W”是 0x57,e 是 0x65。因此,您肯定会获得负返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多