模拟实现C语言库函数

       近来闲来无事,就看了一些网上流传的面试基本题型,手有些痒了,就试着做了,模仿了几个常用的函数,结果和库函数一致。纯属个人练习之用,难登大雅之堂,若有错误之处欢迎指正!

//
//  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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值