my_strlen()的实现
#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;
int my_strlen(const char *src)
{
assert(src != NULL);
int count = 0;
while(*src && src++ && ++count);
return count;
}
my_strcpy()的实现
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
char * my_strcpy(char *src, const char *dsc){
char *p = src;
if(dsc == NULL) return NULL;
while(*dsc && (*src++ = *dsc++));
*src = '\0';
return p;
}
my_strncpy()的实现
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
using namespace std;
char * my_strncpy(char *src, const char *dsc, int len){
assert(len <= strlen(dsc)+1);
if (dsc == NULL) return NULL;
char *p = src;
while(len-- && (*src++ = *dsc++));
*src = '\0';
}
my_strcmp()的实现
int my_strcmp(const char *pa,const char *pb)
{
assert(pa != NULL && pb != NULL);
int k = 0;
while((k = *pa - *bp) == 0 && *pa++ && *pb++);
return k;
}
my_strncmp()的实现
int my_strncmp(const char *pa,const char *pb, int len)
{
assert(pa != NULL && pb != NULL);
int k = 0;
while((k = *pa - *bp) == 0 && len-- && *pa++ && *pb++);
return k;
}
my_strcat()的实现
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
using namespace std;
char *my_strcat(char *dst, const char *src)
{
if (dst == NULL || src == NULL) return dst;
char *p = dst;
while(*p) p++;
while(*p++ = *src++);
return dst;
}
my_strchr()的实现
char * my_strchr(const char * src, int ch)
{
assert(src != NULL);
const char *p = NULL;
while(*src)
{
if (*src == ch){
p = src;
break;
}
}
return p;
}
my_atoi()的实现
我所实现的atoi函数有以下几个要求:
1,这个函数需要丢弃之前的空白字符,直到找到第一个非空白字符。之后从这个字符开始,选取一个可选的正号或者符号后面跟随尽可能多的数字,并将其解释为数字的值。
2,字符串可以在形成整数的字符后包括多余的字符,将这些字符忽略,这些字符对于函数的行为没有影响。
3,如果字符串中的第一个非空白的字符不是有效的整数,或者没有这样的序列存在,字符串为空或者只包含空白字符则不进行转换。
4,如果不能执行有效的转换,则返回 0。如果正确的值超过的可表示的范围,则返回INT_MAX(2147483647)或 INT_MIN(-2147483648)。
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<assert.h>
int str_to_digit(const char *str,int tag)
{
long long val = 0;
while(isdigit(*str)) //while(*str >= '0' && *str <= '9')
{
val = val * 10 + *str - '0';
if(tag)
{
if(val >= INT_MAX+1)
{
val = INT_MAX+1;
break;
}
}else
{
if(val >= INT_MAX)
{
val = INT_MAX;
break;
}
}
++str;
}
return val;
}
int str_to_oce(const char *str,int tag)
{
long long val = 0;
while(isdigit(*str) && *str != '8' && *str != '9') //while(*str >= '0' && *str <= '9')
{
val = val * 8 + *str - '0';
if(tag)
{
if(val >= INT_MAX+1)
{
val = INT_MAX+1;
break;
}
}else
{
if(val >= INT_MAX)
{
val = INT_MAX;
break;
}
}
++str;
}
return val;
}
int str_to_hex(const char *str,int tag)
{ // "2aA"
long long val = 0;
while(isxdigit(*str)) // '0' - '9' 'a''f' 'A' 'F'
{
if(isdigit(*str)) // '0' - '9'
{
val = val * 16 + *str - '0';
}
else
{
char cx = tolower(*str);
val = val * 16 + cx - 'a' + 10;
}
if(tag)
{
if(val >= INT_MAX+1)
{
val = INT_MAX+1;
break;
}
}else
{
if(val >= INT_MAX)
{
val = INT_MAX;
break;
}
}
++str;
}
return val;
}
int my_atoi(const char *str)
{
int val = 0;
int tag = 0;// 1 - // 0 + //" -324324"; "+23423"; "23432"
if(NULL == str) return val;
while(isspace(*str)) ++str;
if(*str == '-')
{
tag = 1;
++str;
}else if(*str == '+')
{
tag = 0;
++str;
}
if(*str == '0') // "0234" "0x234" "0X324";
{
if(*(str+1) == 'x' || *(str+1) == 'X')
{
val = str_to_hex(str+2,tag);
}
else
{
val = str_to_oce(str+1,tag);
}
}
else
{
val = str_to_digit(str,tag);
}
if(tag)
{
val = -val;
}
return val;
}