Implement basic string manipulation functions such as - strchr, strcmp, strcpy, strcat, etc.
/*
* StringFuncs.cpp
*
* Created on: Apr 9, 2012
* Author: Kiran Hegde
*/
#include <string.h>
#include <iostream>
using namespace std;
/**
* The following functions are based on public domain implementation
*/
/* strchr */
char *mystrchr(const char *s, int c) {
/* Scan s for the character. When this loop is finished,
s will either point to the end of the string or the
character we were looking for. */
while (*s != '\0' && *s != (char) c)
s++;
return ((*s == c) ? (char *) s : NULL);
}
/* strcmp */
int mystrcmp(const char *s1, const char *s2) {
unsigned char uc1, uc2;
/* Move s1 and s2 to the first differing characters
in each string, or the ends of the strings if they
are identical. */
while (*s1 != '\0' && *s1 == *s2) {
s1++;
s2++;
}
/* Compare the characters as unsigned char and
return the difference. */
uc1 = (unsigned char) *s1;
uc2 = (unsigned char) *s2;
return ((uc1 < uc2) ? -1 : (uc1 > uc2));
}
/* strcpy */
char *mystrcpy(char *s1, const char *s2) {
char *dst = s1;
const char *src = s2;
/* Do the copying in a loop. */
while ((*dst++ = *src++) != '\0')
; /* The body of this loop is left empty. */
/* Return the destination string. */
return s1;
}
/* strncat */
char *mystrncat(char *s1, const char *s2, size_t n) {
char *s = s1;
/* Loop over the data in s1. */
while (*s != '\0')
s++;
/* s now points to s1's trailing null character, now copy
up to n bytes from s1 into s stopping if a null character
is encountered in s2.
It is not safe to use strncpy here since it copies EXACTLY n
characters, NULL padding if necessary. */
while (n != 0 && (*s = *s2++) != '\0') {
n--;
s++;
}
if (*s != '\0')
*s = '\0';
return s1;
}
/* strncmp */
int mystrncmp(const char *s1, const char *s2, size_t n) {
unsigned char uc1, uc2;
/* Nothing to compare? Return zero. */
if (n == 0)
return 0;
/* Loop, comparing bytes. */
while (n-- > 0 && *s1 == *s2) {
/* If we've run out of bytes or hit a null, return zero
since we already know *s1 == *s2. */
if (n == 0 || *s1 == '\0')
return 0;
s1++;
s2++;
}
uc1 = (unsigned char) *s1;
uc2 = (unsigned char) *s2;
return ((uc1 < uc2) ? -1 : (uc1 > uc2));
}
/* strncpy */
char *mystrncpy(char *s1, const char *s2, size_t n) {
char *dst = s1;
const char *src = s2;
/* Copy bytes, one at a time. */
while (n > 0) {
n--;
if ((*dst++ = *src++) == '\0') {
/* If we get here, we found a null character at the end
of s2, so use memset to put null bytes at the end of
s1. */
memset(dst, '\0', n);
break;
}
}
return s1;
}
/* strrchr */
char *mystrrchr(const char *s, int c) {
const char *last = NULL;
/* If the character we're looking for is the terminating null,
we just need to look for that character as there's only one
of them in the string. */
if (c == '\0')
return strchr(s, c);
/* Loop through, finding the last match before hitting NULL. */
while ((s = strchr(s, c)) != NULL) {
last = s;
s++;
}
return (char *) last;
}
/**
* test the functions
*/
int main() {
const char *testStr = "hello string";
cout << "s = " << testStr << endl;
cout << "mystrchr (s, 'l') = ";
cout << mystrchr(testStr, 'l') << endl;
cout << "mystrrchr (s, 'l') = ";
cout << mystrrchr(testStr, 'l') << endl;
cout << "mystrcmp (s, 'help')= ";
cout << mystrcmp(testStr, "help") << endl;
cout << "mystrcmp (s, 'heck')= ";
cout << mystrcmp(testStr, "heck") << endl;
cout << "mystrcmp (s, 'hello string')= ";
cout << mystrcmp(testStr, "hello string") << endl;
cout << "mystrncmp (s, 'help', 3)= ";
cout << mystrncmp(testStr, "help", 3) << endl;
cout << "mystrncmp (s, 'help', 4)= ";
cout << mystrncmp(testStr, "help", 4) << endl;
cout << "mystrncmp (s, 'held', 4)= ";
cout << mystrncmp(testStr, "held", 4) << endl;
char temp[256];
const char *constStr = "some string";
cout << "s = " << constStr << endl;
mystrcpy(temp, constStr);
cout << "After mystrcpy(temp, s), temp = ";
cout << temp << endl;
mystrncpy(temp, constStr, 4);
cout << "After mystrncpy(temp, s, 6) temp = ";
cout << temp << endl;
cout << "After mystrncat(temp, s, 20) temp = ";
mystrncat(temp, testStr, 20);
cout << temp << endl;
}