Exercise 5.5 - simple versions of strncpy, strncat, and strncmp

Question

Write versions of the library functions strncpy, strncat, and strncmp, which operate on at most the first n characters of their argument strings.

/**
 *
 * Exercise: 5.5
 *
 * Write versions of the library functions strncpy, strncat, and
 * strncmp, which operate on at most the first n characters of their argument
 * strings.
 *
 **/

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

#define MAXSIZE 1000

void mystrncpy(char *, char *, int);

void mystrncat(char *, char *, char *, int);

int mystrncmp(char *, char *, int);

int mystrnlen(char *s);

int main(int argc, char *argv[]) {

    char dest[] = "ABCDEF";
    char source[] = "GHIJ";

    mystrncpy(dest, source, 4);
    printf("%s\n", dest);

    char s1[] = "ABCD";
    char t1[] = "EFGHIJ";
    char *d;

    /* We store the result in a new string d */

    if ((d = (char *) malloc(sizeof(char) * (strlen(s1) + +4 + 1))) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }

    mystrncat(s1, t1, d, 4);
    printf("%s\n", d); /* ABCDEFGH */

    free(d);

    char s2[] = "ABCDEF";
    char t2[] = "ABC";
    int result;

    result = mystrncmp(s2, t2, 3);

    printf("%d\n", result);


    return 0;
}

void mystrncat(char *str1, char *str2, char *dest, int n) {
    while (*str1) {
        *dest++ = *str1++;
    }
    while (n-- > 0) {
        *dest++ = *str2++;
    }

    *dest = '\0';
}


void mystrncpy(char *dest, char *source, int n) {
    while (*source && n-- > 0)
        *dest++ = *source++;

    int extra = mystrnlen(dest) - n;

    while (extra-- > 0) {
        dest++;
    }

    *dest = '\0';
}

/* mystrcmp: return <0 if s <t , 0 if s==t, > 0 if s > t */
int mystrncmp(char *lhs, char *rhs, int n) {
    for (; *lhs == *rhs; lhs++, rhs++)
        if (*lhs == '\0' || --n <= 0)
            return 0;
    return *lhs - *rhs;

}

int mystrnlen(char *s) {
    char *p = s;
    while (*s != '\0') {
        s = s + 1;
    }
    return s - p;
}

Explanation

mystrlen assigns the address of s to p in char *p = s and then goes one character at a time, till it reaches 0. When it is at the end of the word, it subtracts the current address s with intial address p, which thus returns the len of string.

mystrncpy copies n characters of source string to destination. It does this by copying or overwriting one character a time from source to destination and keeps track of count n. When source is exhausted or n characters are copied, it checks if there further characters in destination, if it exists, it goes past them without over-writing and then closes the string by 0.

mystrncat, takes three arguments, str1, str2 and dest. It concatenates n characters from str2 to str1 into a new string dest. It does this by copying all characters from str1 to dest and then keeps a track of count n, and copies n characters of str2 to dest. After copying n characters, it closes the dest string by 0 character.

mystrncmp, compares the lhs string with rhs string. It compares one character at a time and as long as both characters are same, it keeps going and if the lhs is exhaused before n characters are compared, it means we still satisfy the criteria and we return 0. Otherwise, it returns the difference between lhs character and rhs character, which will be 0 if they are equal, negative if lhs is smaller than rhs or positive value if lhs is greater than rhs.