近来闲来无事,就看了一些网上流传的面试基本题型,手有些痒了,就试着做了,模仿了几个常用的函数,结果和库函数一致。纯属个人练习之用,难登大雅之堂,若有错误之处欢迎指正!
//
// main.c 模拟实现C语言库函数
//
// GPH on 12-8-10.
// Copyright (c) 2012年 GPH.
//
#include <stdio.h>
//s1主串,s2子串 返回s2在s1的位置
char* myStrstr(const char *s1,const char *s2);
//将src按token分割
char *myStrtok(char *src, char *token);
//src复制到dest中
char *myStrcpy(char *dest,const char *src);
//src连接到dest后面
char *myStrcat( char *dest,const char *src);
//数字字符串转换为数字
int myatoi(const char *s);
//比较s1,s2的差值
int myStrcmp(const char *s1,const char *s2);
char* myStrstr(const char *s1,const char *s2)
{
if ( strlen(s2) > strlen(s1))
{
return NULL;//不符合规则就返回空
}
const char *tmp1 = s1;
const char *tmp2 = s2;
unsigned long count = 0;
while ('\0' != *s1)
{
//逐个比较
while ((*tmp1 == *tmp2) && ('\0' != *tmp2 && '\0' != *tmp1) )
{
count++;
tmp1++;
tmp2++;
}
//完全相等
if (count == strlen(s2))
{
return s1;
}
count = 0;//复位
s1++; // 下一位
tmp2 = s2; //子串复位
tmp1 = s1;
}
//否则返回空
return NULL;
}
char *myStrtok(char *src, char *token)
{
static char *ptr;
char *ret;
if (src)
ptr = src;
int i, flag = 0;
if (ptr == NULL)
return NULL;
long len = strlen(ptr);
ret = ptr;
for (i=0; i<len; i++)
{
if ((flag == 0) &&
(match(ptr[i], token) == 0))
{
ret += i;
flag = 1;
} else if ((flag == 1) &&
(match(ptr[i], token) == 1))
{
ptr[i] = '\0';
ptr += (i+1);
return ret;
} else if (flag == 1 && i == len-1)
{
ptr = NULL;
return ret;
}
}
return NULL;
}
//char *myStrcpy(char *dest,const char *src);
/*
功能:把src所指的字符复制到 dest
说明:dest有足够的空间来存储src的字符串
返回:指向dest的指针
*/
char *myStrcpy(char *dest,const char *src)
{
assert(dest != NULL && src != NULL);
char *tmp = dest;
while ( (*tmp++ = *src++) );
return dest;
}
/* char *myStrcat(char *dest,const char *src);
功能:把src所指的字符添加到 dest结尾处
说明:src和dest所指的内存区域不能有重叠,并有足够的空间来存储src的字符串
返回:指向dest的指针
*/
char *myStrcat( char *dest,const char *src)
{
char *tmp = dest;
assert(dest != NULL && src != NULL);
while (*tmp++);
tmp--;
while ( (*tmp++ = *src++) );
return dest;
}
// strcmp(s1,s2)
// 当 s1 < s2 返回为负数
// 当 s1 == s2 返回0
// 当 s1 > s2 返回整数
// 即:两个字符串自左向右逐个字符的比较
//("China","Germany"):-4
//("Apple", "And"):2
//("Hello","Hello"):0
int myStrcmp(const char *s1,const char *s2)
{
//char *tmp1 = s1,*tmp2 = s2;
assert(s1 != NULL && s2 != NULL);
while( (*s1 == *s2) && *s1 && *s2)
{
s1++;
s2++;
}
return *s1-*s2;
}
// atoi 将一个字符串转化为一个整数,从最前面开始,若过有空格则跳过,直到第一个非空格字符,开始转换
// 第一个是 +或-,则会转换正负数
// 第一个字符是字母,则返回0
// 中间有字母或空格,只转换前面的
int myatoi(const char *s)
{
char *s1 = s;
int sum = 0;
int flag = 0;
if((*s1 >= 'A' && *s1 <= 'Z') || (*s1 >= 'a' && *s1 <= 'z'))
{
return sum;
}
while ('\0' != *s1)
{
if(*s1 > '9' || *s1 < '0')
{
//"- 123","+ 123"在atoi中结果为0
//所以如果符号确定再出现其他的就返回
if (sum || flag) //说明是中间出现的其他字符
{
return flag?flag*sum:sum;
}
if (*s1 == ' ')
{
s1++;
continue;
}
flag = 1;
if (*s1 == '-')
{
flag = -1;
}
s1++;
continue;
}
sum *= 10;
sum += *s1++ - '0';
}//end_while
return flag?flag*sum:sum;//flag为0返回sum,否则就×符号
}
int main(int argc, const char * argv[])
{
//测试myatoi()
printf("%d\n",myatoi("123"));
printf("%d\n",myatoi("123a12"));
printf("%d\n",myatoi("123 12"));
printf("%d\n",myatoi("+123"));
printf("%d\n",myatoi("-123"));
printf("%d\n",myatoi("a123"));
printf("%d\n",myatoi(" 1001.2 3"));
//测试myStrcmp
printf("%d\n",myStrcmp("China", "Germany"));
printf("%d\n",myStrcmp("Apple", "And"));
printf("%d\n",myStrcmp("Hello", "Hello"));
//测试myStrcat()
char a[] = "my name is";
printf("%s\n",myStrcat(a," Kitty"));
//测试myStrcpy()
char b[10],c[] = "Hello World!";
printf("%s,%s\n",myStrcpy(b,c),b);
return 0;
}