首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强直性C运动

强直性C运动
EN

Stack Overflow用户
提问于 2009-10-11 21:07:51
回答 4查看 6.6K关注 0票数 0

我试着在K&R C书中做5-4练习。我已经编写了strncpy和strncat的方法,但是我很难确切地理解这个练习的strncmp部分应该返回什么。

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

最多比较字符串s的n个字符到字符串t;如果是st,则返回>0。

假设我有三个字符串:

代码语言:javascript
复制
char s[128] = "abc"
char t[128] = "abcdefghijk"
char u[128] = "hello"

我想用我要写的strncmp函数来比较它们。我知道

代码语言:javascript
复制
strncmp(s, t, 3)

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

代码语言:javascript
复制
strncmp(s, t, 5) and
strncmp(s, u, 4)

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

我只想知道这两个比较的结果是什么,以及为什么,这样我就可以编写我的strncmp版本并完成这个练习。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-11 21:12:20

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

代码语言:javascript
复制
strncmp(s, t, 5) = -100  // '\0' - 'd'
strncmp(s, u, 4) = -7    // 'a' - 'h'

这就是你要找的吗?

票数 3
EN

Stack Overflow用户

发布于 2009-10-11 21:29:07

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

票数 2
EN

Stack Overflow用户

发布于 2011-06-27 17:20:22

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

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

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

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

函数的strncmp()函数应该比较s1指向的数组与s2指向的数组之间的不超过n个字节(不对空字节后面的字节进行比较)。

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

这应该是您实现它所需要知道的全部内容。你应该注意到,虽然:

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

祝好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1551778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档