Search code examples
cstringc-strings

What is the difference between memcmp, strcmp and strncmp in C?


I wrote this small piece of code in C to test memcmp() strncmp() strcmp() functions in C.

Here is the code that I wrote:

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

Can somebody explain me the differences because I am confused with these three functions?

My main problem is that I have a file in which I tokenize its line of it,the problem is that when I tokenize the word "atoms" in the file I have to stop the process of tokenizing.

I first tried strcmp() but unfortunately when it reached to the point where the word "atoms" were placed in the file it didn't stop and it continued,but when I used either the memcmp() or the strncmp() it stopped and I was happy.

But then I thought,what if there will be a case in which there is one string in which the first 5 letters are a,t,o,m,s and these are being followed by other letters.

Unfortunately,my thoughts were right as I tested it using the above code by initializing word1 to "atomsaaaaa" and word2 to atoms and memcmp() and strncmp() in the if statements returned 0.On the other hand strcmp() it didn't. It seems that I must use strcmp().


Solution

  • In short:

    • strcmp compares null-terminated C strings
    • strncmp compares at most N characters of null-terminated C strings
    • memcmp compares binary byte buffers of N bytes

    So, if you have these strings:

    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";
    

    Then these results hold true:

    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