c的库函数写的很nice,实现下简单版本:
strcmp strncmp:
#include <stddef.h>
#include <string.h>
int strcmp_my(const char *s1, const char *s2)
{
register signed char __res;
while(1) {
if ((__res = *s1 - *s2++) != 0 || !*s1++)
break;
}
return __res;
}
int strncmp_my(const char *s1, const char *s2, size_t n)
{
register signed char __res = 0;
while (n) {
if ((__res = *s1 - *s2++) != 0 || !*s1++)
break;
n--;
}
}
strcpy strncpy:
#include <stddef.h>
char * ___strtok = NULL;
char * strcpy(char *dest, const char *src)
{
while (*src != '\0')
*dest++ = *src++;
*dest = '\0';
return dest;
}
char * strcpy_my(char *dest, const char *src)
{
char *tmp = dest;
while ((*tmp++ = *src++) != '\0')
/* do nothing */;
return tmp;
}
char * strncpy(char *dest, const char *src, size_t n)
{
size_t i;
for (i = 0; i < n && *src != '\0'; ++i)
*dest++ = *src++;
for (; i < n; ++i)
*dest++ = '\0';
return dest;
}
char * strncpy_my(char *dest, const char *src, size_t n)
{
char *tmp = dest;
while (n-- && (*tmp++ = *src++) != '\0')
/* do nothing */;
return tmp;
}
strcat strncat:
#include <stddef.h>
#include <string.h>
char * ___strtok = NULL;
char * strcat(char *dest, const char *src)
{
size_t destLength = strlen(dest);
size_t i;
for (i = 0; src[i] != '\0'; ++i)
dest[destLength + i] = src[i];
return dest;
}
char * strncat(char *dest, const char *src, size_t n)
{
size_t destLength = strlen(dest);
size_t i;
for (i = 0 ; i < n && src[i] != '\0' ; ++i)
dest[destLength + i] = src[i];
dest[destLength + i] = '\0';
return dest;
}
char * strcat_my(char *dest, const char *src)
{
char *tmp = dest;
while (*dest)
dest++;
while ((*tmp++ = *src++) != '\0')
;
return tmp;
}
char * strncat_my(char *dest, const char *src, size_t n)
{
char *tmp = dest;
if (n) {
while (*dest)
dest++;
while ((*tmp++ = *src++) != '\0') {
if (--n)
break;
}
}
return tmp;
}
strchr strrchrstrlen:
#include <stddef.h>
#include <string.h>
char * strchr(const char *s, int c)
{
for (; *s != c ; ++s)
if (*s == '\0')
return NULL;
return (char *)s;
}
char * strrchr(const char *s, int c)
{
int length = 0;
while (*s++ != '\0')
length++;
s--;
for (; length >= 0 && *s!= c ; length--, --s)
if (length == 0)
return NULL;
return (char *)s;
}
size_t strlen(const char *s)
{
const char *sc;
for (sc = s; *sc != '\0'; sc++)
/* do nothing */;
return sc - s;
}
strspn strbrk:
#include <stddef.h>
#include <string.h>
size_t strspn(const char *s, const char *accept)
{
const char *p;
const char *q;
size_t count = 0;
for (p = s; *p != '\0'; ++p) {
for (q = accept; *q != '\0'; ++q) {
if (*p == *q)
break;
}
if (*q == '\0')
return count;
++count;
}
return count;
}
/*
* search the first existence letter of accept in s
*/
char * strpbrk(const char *s, const char *accept)
{
const char *p, *q;
for (p = s; *p != '\0'; ++p) {
for(q = accept; *q != '\0'; ++q) {
if (*p == *q)
return (char *)p;
}
}
return NULL;
}
strdup
#include<stdio.h>
#include<stdlib.h>
char * strdup( char const *string )
{
char *new_string;
new_string = malloc( strlen( string ) * sizeof( char ) + 1 );
if( new_string != NULL )
strcpy( new_string, string );
return new_string;
}
strstr