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

und*_*012 38 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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

我第一次尝试strcmp()但不幸的是当它到达文件中放置"原子"这个词的时候它没有停止并且它继续,但当我使用它memcmp()strncmp()它停止时我很高兴.

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

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

Ada*_*eld 99

简而言之:

  • 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";
Run Code Online (Sandbox Code Playgroud)

然后这些结果成立:

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
Run Code Online (Sandbox Code Playgroud)


Ed *_* S. 8

memcmp比较一些字节. strcmp等比较字符串.

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

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

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