【问题标题】:strncmp C Exercisestrncmp C 练习
【发布时间】:2009-10-11 21:07:51
【问题描述】:

我正在尝试做 K&R C 书中的练习 5-4。我已经编写了 strncpy 和 strncat 的方法,但是我在理解练习的 strncmp 部分要返回什么时遇到了一些麻烦。

strncmp的定义(来自K&R书的附录B)是:

将字符串s的最多n个字符与字符串t进行比较;如果 st

,则返回 >0

假设我有 3 个字符串:

char s[128] = "abc"
char t[128] = "abcdefghijk"
char u[128] = "hello"

我想使用我必须编写的 strncmp 函数来比较它们。我知道

strncmp(s, t, 3)

将返回 0,因为 abc == abc。我感到困惑的是其他比较。例如

strncmp(s, t, 5) and
strncmp(s, u, 4)

第一个匹配第三个位置,然后它们不再匹配,第二个示例根本不匹配。

我真的只是想知道其他 2 个比较返回什么以及为什么这样我就可以编写我的 strncmp 版本并完成练习。

【问题讨论】:

  • 有什么原因你不能只写一个程序来调用 strncmp 看看它返回什么?
  • 我确实编写了一个程序,但我不明白为什么返回的值是返回的值。知道答案几乎和知道为什么是答案一样重要。我想真正理解这些概念。
  • 这不是你的问题所说的:它说“我真的只是想知道其他 2 个比较返回什么”。
  • 实际上整句话说的是“我真的只是想知道其他 2 个比较返回什么以及为什么这样我就可以编写我的 strncmp 版本并完成练习。”你会注意到上面写着“AND WHY”

标签: c string


【解决方案1】:

两者都返回一个负数(它只是使用字符顺序进行比较)。我刚刚做了一个快速测试,在我的机器上它返回了最后比较字符的差异。所以:

strncmp(s, t, 5) = -100  // '\0' - 'd'
strncmp(s, u, 4) = -7    // 'a' - 'h'

这就是你要找的吗?

【讨论】:

  • 有点,是的。我更感兴趣的不仅仅是知道答案,而是理解为什么 strncmp(s, t, 5) = -100 或为什么 strncmp(s, u, 4) = -7。知道答案很好,但问题是为什么会这样。
  • 我在答案中写道 - 这就是 cmets 所说的。 'a' - 'h' = -7,所以函数返回 -7。
  • 同样,空字符 ('\0') 减去 'd' 是 -100,这就是答案的来源。
  • 我不得不查看您的答案以及您在 cmets 中提供的进一步解释,但我现在明白了。 strncmp 占据两个字符不相等的第一个位置,并返回这两个字符的差异。谢谢。
  • 但不要忘记,不能保证来自特定 C 实现的返回值将是字符之间的差异。该标准只是说它将是“大于、等于或小于零的整数”。 (引自我的旧 X3.159-1989。)
【解决方案2】:

将第一个不匹配位置的字符转换为unsigned char,然后进行数值比较——如果s1中的那个字符小于s2中的对应字符,则返回一个负数;如果大于,则返回正数。

【讨论】:

    【解决方案3】:

    strncmp 的约定是返回一个整数值,其符号表示比较的结果:

    • 负值表示第一个操作数比较“小于”第二个操作数,
    • 一个正的非零值表示第一个操作数比较为“大于”第二个操作数,并且
    • 0 表示两个操作数比较为彼此“相等”。

    之所以这样定义,而不是说,“小于”返回 -1,“等于”返回 0,“大于”返回 +1,是为了不限制实现。

    为特定 C 运行时库返回的值取决于函数的实现方式。 strncmp()(跟踪 C 标准)的 Posix 规范 (IEEE 1003.1) 说:

    strncmp() 函数应比较不超过 n 个字节(null 后面的字节) byte 不比较)从 s1 指向的数组到 s2 指向的数组。

    非零返回值的符号由差的符号决定 在第一对字节的值之间(都解释为无符号类型 char) 在被比较的字符串中有所不同。

    这应该是实现它所需的全部知识。不过,您应该注意:

    • strncmp() 不是“安全的”,因为它会受到缓冲区溢出的影响。正确的实现会愉快地比较字符,直到遇到 ASCII NUL、达到最大长度或尝试访问受保护的内存。
    • 规范说返回值的符号是基于第一对不同字符之间的增量;没有强制要求特定的返回值。

    祝你好运。

    【讨论】:

      【解决方案4】:

      它是字典顺序,字符串从左到右按字母顺序比较。

      所以 abc

      strncmp(s, t, 5) = -1 strncmp(s, t, 5) = -1

      【讨论】:

      • 我认为返回 -1 在语义上是正确的,但这不是我的本地实现所做的。 (Mac OS X 10.6.1)
      • 要求是'
      • @Jonathan 正在解释我的本地实现是如何工作的,这似乎是编写它的快速方法。
      猜你喜欢
      • 2020-10-21
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2012-07-02
      • 2020-06-25
      相关资源
      最近更新 更多