strncmp C练习

时间:2009-10-11 21:07:52

标签: c string

我正在尝试在K& R C书中练习5-4。我已经编写了strncpy和strncat的方法,但是我很难理解为练习的strncmp部分返回的确切内容。

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

  

将字符串s的最多n个字符与字符串t进行比较;返回< 0如果s< t,0如果s == t,或者> 0如果s> t

假设我有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)

第一个位置与第3个位置匹配,之后它们不再匹配,第二个示例完全不匹配。

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

4 个答案:

答案 0 :(得分:2)

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

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

这就是你要找的东西吗?

答案 1 :(得分:2)

第一个不匹配位置的字符转换为unsigned char,然后进行数字比较 - 如果s1中的字符小于s2中的相应字符,则为负数号码被退回;如果它更大,则返回正数。

答案 2 :(得分:2)

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

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

这样定义的原因,而不是说,“返回-1表示”小于“,0表示”等于“而+1表示”大于“是不限制实现。

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

  

strncmp()函数应比较不超过n个字节(跟随null的字节)   字节未被比较)从s1指向的数组到s2指向的数组。

     

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

这应该是你需要知道的所有实现它。你应该注意,尽管如此:

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

答案 3 :(得分:1)

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

所以abc< abcdefghijk<喂

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