我试着在K&R C书中做5-4练习。我已经编写了strncpy和strncat的方法,但是我很难确切地理解这个练习的strncmp部分应该返回什么。
strncmp的定义(取自K&R书附录B)是:
最多比较字符串s的n个字符到字符串t;如果是st,则返回>0。
假设我有三个字符串:
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)第一个与第三个位置匹配,然后它们不再匹配,第二个例子根本不匹配。
我只想知道这两个比较的结果是什么,以及为什么,这样我就可以编写我的strncmp版本并完成这个练习。
发布于 2009-10-11 21:12:20
两者都返回一个负数(它只是使用字符顺序进行比较)。我刚刚做了一个快速测试,在我的机器上,它返回了最后一个比较字符的差异。所以:
strncmp(s, t, 5) = -100 // '\0' - 'd'
strncmp(s, u, 4) = -7 // 'a' - 'h'这就是你要找的吗?
发布于 2009-10-11 21:29:07
将第一个非匹配位置的字符转换为unsigned char,然后进行数值比较--如果s1中的字符小于s2中的对应字符,则返回负数;如果该字符更大,则返回一个正数。
发布于 2011-06-27 17:20:22
strncmp的合同是返回一个整数值,其符号表示比较的结果:
其定义是这样的,而不是“返回-1”表示“小于”,0表示“等于”,+1表示“大于”,这是为了不限制实现。
特定C运行时库返回的值取决于函数的实现方式。strncmp()的Posix规范(IEEE 1003.1) (它跟踪C标准)说:
函数的strncmp()函数应该比较s1指向的数组与s2指向的数组之间的不超过n个字节(不对空字节后面的字节进行比较)。
非零返回值的符号由所比较的字符串中不同的第一对字节(都解释为类型无符号字符)的值之间的差异符号决定。
这应该是您实现它所需要知道的全部内容。你应该注意到,虽然:
strncmp()并不“安全”,因为它会受到缓冲区溢出的影响。适当的实现将愉快地比较字符,直到它遇到ASCII NUL、达到最大长度或尝试访问受保护的内存为止。祝好运。
https://stackoverflow.com/questions/1551778
复制相似问题