1

我用 C 编写了一小段代码来测试strncmp()功能memcmp()。这是代码。

#include <stdio.h>
#include <string.h>

int main()
{
    const char s1[] = "abcd\0\0\0\0";
    const char s2[] = "abcd\0abc";
    
    printf("strncmp(s1, s2, 4) = %d\n", strncmp(s1, s2, 5)); //0
    printf("strncmp(s1, s2, 8) = %d\n", strncmp(s1, s2, 8)); // why returns 0? Thx
    printf("memcmp(s1, s2, 4) = %d\n", memcmp(s1, s2, 5)); // 0
    printf("memcmp(s1, s2, 8) = %d\n", memcmp(s1, s2, 8)); // -120

    return 0;
}

我发现strncmp(s1, s2, 8) = 0同时memcmp(s1, s2, 8) = -97. 因为\0不等于a,我认为strncmp(s1, s2, 8)应该返回一个非零值。

然后我尝试打印s1s2长度,它们都是 9。我尝试测试更多案例,strncmp()按预期工作。

s1最后,我尝试了与and类似的情况s2strncmp返回错误值。以下是我的代码:

#include <stdio.h>
#include <string.h>

int main()
{
    const char s1[] = "abcd\0\0\0\0";
    const char s2[] = "abcd\0xyz";
    
    printf("strncmp(s1, s2, 4) = %d\n", strncmp(s1, s2, 5)); //0
    printf("strncmp(s1, s2, 8) = %d\n", strncmp(s1, s2, 8)); // why returns 0? Thx
    printf("memcmp(s1, s2, 4) = %d\n", memcmp(s1, s2, 5)); // 0
    printf("memcmp(s1, s2, 8) = %d\n", memcmp(s1, s2, 8)); // -120

    printf("sizeof(s1) = %lu\n", sizeof(s1)); // 9
    printf("sizeof(s2) = %lu\n", sizeof(s2)); // 9

    printf("%d\n", strncmp("\0", "a", 1)); // -1
    printf("%d\n", strncmp("\0\0", "ab", 2)); // -1
    printf("%d\n", strncmp("a\0", "ab", 2)); // -1

    printf("%d\n", strncmp("a\0\0", "a\0b", 3)); // 0, why?

    return 0;
}

我想也许strncmp()在它相遇之后不会比较字符\0?不就是这样吗strcmp。我不确定它是否strncmp()strcmp().

4

2 回答 2

4

根据手册页,您的怀疑是正确的:

因为 strncmp() 是为比较字符串而不是二进制数据而设计的,所以不会比较出现在 `\0' 字符之后的字符。

将两个以空字符结尾的字符串连接为带有两个空字符的单个字符串只会导致显示第一部分。

于 2022-01-27T02:47:50.790 回答
1

我想也许strncmp()在它相遇之后不会比较字符\0

是的,这是正确的。

不就是这样吗strcmp。我不确定它是否strncmp()strcmp().

strcmp()比较两个以空字符结尾的字节串。

strncmp()比较不超过count字符(不比较空字符后面的字符)[count传递给strncmp()]的第三个参数在哪里。

例如:

    const char s1[] = "abcd\0\0\0\0";
    const char s2[] = "abcd\0xyz";

以下语句将进行完全相同的比较,即两者都将比较第一个5字符并返回结果0(两个字符串的内容相同),因为两个字符串中的第一个5字符相同并且5一个字符是空字符(\0):

    strncmp (s1, s2, 8);
    strcmp (s1, s2);

strncmp()将为第三个参数 value 产生相同的结果765传递给它。

但考虑以下情况:

    strncmp (s1, s2, 4); 
    strcmp (s1, s2);

但是,在这种情况下,两者都将返回0(相同的字符串),但 and 执行的比较strncmp()不同strcmp()strncmp()将仅比较第一个4字符,而strcmp()将比较直到找到空字符。第三个参数值,32传递给.10strncmp()

再举一个例子:

    const char s1[] = "abcdef";
    const char s2[] = "abcde";

strcmp (s1, s2)这些字符串永远不会返回相等,但
strncmp (s1, s2, 5 /*or 4/3/2/1/0 */)会将它们比较相等。

还有一点,

然后我尝试打印 s1 和 s2 的长度,它们都是 9。

请注意,sizeof不给出长度,而是给出对象(或类型)的大小(以字节为单位)。如果要计算字符串的长度,请使用strlen().


要记住的几点:

1)。strncmp()不比较空字符之后的字符。

2)。memcmp()和之间的主要区别之一strncmp()strncmp()荣誉1)空字符在进行比较memcmp()时却没有。

于 2022-01-27T08:10:26.687 回答