C中的memcmp,strcmp和strncmp有什么区别?

时间:2012-10-26 22:57:04

标签: c string c-strings

我在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");
}

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

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

我首先尝试strcmp(),但不幸的是,当它达到“原子”这个词放在文件中时它没有停止并继续,但是当我使用memcmp()时或strncmp()它停了,我很高兴。

但后来我想,如果有一个字符串,其中前5个字母是a,t,o,m,s,这些字母后面跟着其他字母。

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

5 个答案:

答案 0 :(得分:91)

简而言之:

  • strcmp比较以null结尾的C字符串
  • strncmp最多比较N个以空字符结尾的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

答案 1 :(得分:7)

memcmp比较了多个字节。 strcmp等比较字符串

你在你的例子中作弊,因为你知道两个字符串都是5个字符长(加上空终止符)。但是,如果你不知道琴弦的长度怎么办呢?好吧,你使用strcmp,因为它知道如何处理字符串memcmp没有。

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

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

答案 2 :(得分:4)

的strcmp():

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

STRNCMP():

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

memcmp():

  • 此函数用于比较使用其内存的两个变量。它不是逐个比较它,它一次比较四个字符。如果您的程序太关注速度,我建议使用memcmp()。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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