通过实现这些函数,让我明白写一个简单的函数其实也要考虑一些问题的,最基本的函数参数的合法性,使用全局变量,全局函数等的合法性。而且写代码时要细心,在for循环语句中,循环次数很容易搞错,导致数组操作越界或指针访问越界。
strlen的实现:
size_t myStrlen(const char *str)
{
assert(str !=NULL);
size_t len=0;
while((*str++) !='\0')
{
++len;
}
return len;
}
strcpy的实现:
char *myStrcpy(char *strDest, const char *strSrc)
{
assert((strDest !=NULL) && (strSrc !=NULL));
char* p=strDest;
while((*strDest++ = *strSrc++) !='\0');
return p;
}
strncpy的实现:
char* strncpy(char* strDest,const char* strSource,size_t count)
{
assert((strDest !=NULL)&&(strSource !=NULL));
char* p=strDest;
while(count &&(*strDest++=*strSource++)) /* copy string */
--count;
if(count !=0) /* pad out with zeroes */
while(--count)
*strDest++='\0';
return p;
}
strcmy的实现:
int myStrcmp(const char *str1, const char *str2)
{
assert((str1 != NULL) && (str2 != NULL));
//循环找到第一个不相等的字符
for (; *str1 == *str2; ++str1,++str2)
{
if (*str1 == '\0')
{
return 0;
}
}
return *(unsigned char*)str1 - *(unsigned char*)str2 >0 ? 1:-1;
}
strcat的实现:
char* myStrcat(char *str1, const char *str2)
{
assert((str1 !=NULL) && (str1 !=NULL));
char* p=str1;
while((*str1++) !='\0');
--str1;
for(; *str2 !='\0'; ++str1,++str2)
{
*str1=*str2;
}
*str1='\0';
return p;
}
atoi的实现:
int atoiTest(const char* s)
{
assert(s !=NULL);
int i = 0,sum = 0,sign;
//输入的数前面可能还有空格或制表符应加判断
while(' '==s[i] || '/t'==s[i])
{
++i;
}
sign = ('-'==s[i])? -1:1;
if('-'==s[i] || '+'==s[i])
{
++i;
}
while(s[i] >= '0' && s[i] <= '9')
{
sum = s[i]-'0' +sum*10;
++i;
}
return sign*sum;
}
itoa的实现:
char* itoaTest(int num,char* buf,int radix)
{
assert(buf !=NULL);
int sign,digval;
char* p=buf;
sign=(radix==10 && num<0);
if (sign)
{
*p++='-';
num =-num;
}
do
{
digval=num % radix;
num /= radix;
if(digval >9)
{
*p++ =digval -10 + 'a';
}
else
{
*p++ =digval + '0';
}
}while(num >0);
*p-- = '\0';
char* q=buf;
if(sign)
{
++q;
}
char temp;
while(q<p)
{
temp=*q;
*q=*p;
*p=temp;
++q;
--p;
}
return buf;
}