strnc练习

strnc练习,c,string,C,String,我正在做K&R C书中的练习5-4。我已经编写了strncpy和strncat的方法,但是我在理解这个练习的strncmp部分应该返回什么方面遇到了一些困难 strncmp的定义(摘自K&R手册附录B)为: 比较字符串s和字符串t最多n个字符;返回t 假设我有3个字符串: char s[128] = "abc" char t[128] = "abcdefghijk" char u[128] = "hello" 我想用我必须编写的strncmp函数来比较它们。我知道 strncmp(s, t,

我正在做K&R C书中的练习5-4。我已经编写了strncpy和strncat的方法,但是我在理解这个练习的strncmp部分应该返回什么方面遇到了一些困难

strncmp的定义(摘自K&R手册附录B)为:

比较字符串s和字符串t最多n个字符;返回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)
第一个匹配第三个位置,然后它们不再匹配,第二个示例根本不匹配


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

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

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

这就是你要找的吗?

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

所以abc strncmp(s,t,5)=-1
strncmp(s,t,5)=-1

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

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

  • 负值表示第一个操作数比较为“小于”第二个操作数
  • 正值非零值表示第一个操作数比第二个操作数“大”,并且
  • 0表示两个操作数之间的比较为“相等”
之所以这样定义,而不是说,“return-1表示“小于”,0表示“等于”,+1表示“大于”,是为了不约束实现

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

strncmp()函数比较的字节数不得超过n个(空值后面的字节 字节(不进行比较)从s1指向的数组到s2指向的数组

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

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

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

祝你好运。

有什么原因不能编写一个程序来调用strncmp并查看它返回什么吗?我确实编写了一个程序,但我不明白返回的值为什么是返回的值。知道答案几乎和知道为什么是答案一样重要。我想真正理解这些概念。这不是问题所在你的问题是这样的:“我真的只想知道这两个其他的比较结果是什么”。实际上整个句子都说“我真的只想知道这两个其他的比较结果是什么,以及为什么,这样我就可以编写我的strncmp版本并完成练习。”你会注意到它说“为什么?”“我认为返回-1在语义上是正确的,但我的本地实现并不是这样做的。(Mac OS X 10.6.1)要求为“<0”;'-100'和'-1'都小于零,因此都是正确的。典型的技巧是在检测到差异的地方返回“s1[i]-s2[i]”。@Jonathan正在解释我的本地实现是如何工作的,似乎这是编写它的最快方法。有点,是的。我更感兴趣的不仅仅是知道答案,而是理解为什么strncmp(s,t,5)=-100或者为什么strncmp(s,u,4)=-7。知道答案是好的,但问题是为什么会这样。我在答案中写道——这就是评论所说的一个'-'h'=-7,因此函数返回-7。同样,空字符('\0')减去'd'是-100,这就是答案的来源。我必须查看您的答案以及您在注释中提供的进一步解释,但我现在明白了。strncmp位于两个字符不相等的第一位,并返回这两个字符的差值。谢谢。但是不要忘记,不能保证从特定的C实现返回的值会是字符之间的差异。标准只是说它将是“大于、等于或小于零的整数”。(引用我的旧X3.159-1989。)