53

我用 C 编写了一小段代码来测试 C 中的memcmp() strncmp() strcmp()函数。

这是我写的代码:

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

int main() {
        char *word1="apple",*word2="atoms";

        if (strncmp(word1,word2,5)==0)
                printf("strncmp result.\n");
        if (memcmp(word1,word2,5)==0)
                printf("memcmp result.\n");
        if (strcmp(word1,word2)==0)
                printf("strcmp result.\n");
}

有人可以解释我的区别,因为我对这三个功能感到困惑吗?

我的主要问题是我有一个文件,我在其中标记了它的行,问题是当我标记文件中的“原子”一词时,我必须停止标记过程。

我第一次尝试strcmp(),但不幸的是,当它到达文件中放置“原子”一词的位置时,它并没有停止而是继续,但是当我使用 thememcmp()或 thestrncmp()时它停止了,我很高兴。

但后来我想,如果有一个字符串的前 5 个字母是 a,t,o,m,s 并且后面跟着其他字母怎么办。

不幸的是,我的想法是正确的,因为我使用上面的代码通过初始化word1为“atomsaaaaa”和word2原子并且memcmp()strncmp()if 语句中返回 0 来测试它。另一方面strcmp(),它没有。看来我必须使用strcmp().

4

6 回答 6

115

简而言之:

  • strcmp比较以 null 结尾的 C 字符串
  • strncmp比较最多 N 个以 null 结尾的 C 字符串的字符
  • memcmp比较 N 个字节的二进制字节缓冲区

所以,如果你有这些字符串:

const char s1[] = "atoms\0\0\0\0";  // extra null bytes at end
const char s2[] = "atoms\0abc";     // embedded null byte
const char s3[] = "atomsaaa";

那么这些结果成立:

strcmp(s1, s2) == 0      // strcmp stops at null terminator
strcmp(s1, s3) != 0      // Strings are different
strncmp(s1, s3, 5) == 0  // First 5 characters of strings are the same
memcmp(s1, s3, 5) == 0   // First 5 bytes are the same
strncmp(s1, s2, 8) == 0  // Strings are the same up through the null terminator
memcmp(s1, s2, 8) != 0   // First 8 bytes are different
于 2012-10-26T23:06:10.007 回答
9

memcmp比较多个字节。 strcmp之类的比较字符串

您在示例中有点作弊,因为您知道两个字符串都是 5 个字符长(加上空终止符)。但是,如果您不知道字符串的长度(通常是这种情况)怎么办?好吧,您使用它strcmp是因为它知道如何处理字符串memcmp但不知道。

memcmp都是关于比较字节序列的。如果您知道每个字符串有多长,那么是的,您可以使用memcmp它们来比较它们,但这种情况多久发生一次?很少。您经常需要字符串比较函数,因为……他们知道字符串是什么以及如何比较它们。

至于您遇到的任何其他问题,您的问题和代码都不清楚。请放心,尽管strcmp在字符串比较的一般情况下,这比现在更好memcmp

于 2012-10-26T23:03:27.010 回答
3

strcmp():

  • 它用于比较存储在两个变量中的两个字符串,比较它们需要一些时间。所以它减慢了这个过程。

strncmp():

  • 它与前一个非常相似,但在这个中,它只比较前 n 个字符。这也减慢了这个过程。

memcmp():

  • 此函数用于使用它们的内存比较两个变量。它不会一一比较它们,它一次比较四个字符。如果你的程序太在意速度,我推荐使用 memcmp()。
于 2014-09-07T10:55:08.057 回答
1

对于 strcmp,您只想比较您知道将是字符串的内容,但有时情况并非总是如此,例如读取二进制文件的行,您可能希望使用 memcmp 来比较某些包含的输入行NUL 字符但匹配,您可能希望继续检查输入的进一步长度。

于 2014-02-15T23:08:37.467 回答
1

strncmp 和 memcmp 是相同的,只是前者处理 NULL 终止的字符串。

于 2013-12-10T09:40:01.433 回答
0

总结一下:

  • strncmp() 和 strcmp() 将 0 字节视为字符串的结尾,并且不进行比较

  • 对于 memcmp(),一个 0 字节没有特殊意义

于 2021-10-25T16:40:54.323 回答