我正在尝试在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版本并完成练习。
答案 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的合同是返回一个整数值,其符号表示比较结果:
这样定义的原因,而不是说,“返回-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