字符串操作&内存操作

1、strcpy

char * strcpy( char *strDest, const char *strSrc )          
{         
    if(strDest == strSrc) { return strDest; }      
    assert( (strDest != NULL) && (strSrc != NULL) );         
    char *address = strDest;          
    while( (*strDest++ = * strSrc++) != '\0' );          
    return address;         
}

2、strncpy

char *strncpy(char *strDes, const char *strSrc, unsigned int count)          
{          
    assert(strDes != NULL && strSrc != NULL);          
    char *address = strDes;          
    while (count-- && *strSrc != '\0')          
        *strDes++ = *strSrc++;       
    *strDes = '\0';      
    return address;          
}

3、strcmp

int strcmp(const char *s, const char *t)       
{       
    assert(s != NULL && t != NULL);       
    while (*s && *t && *s == *t)       
    {       
        ++ s;       
        ++ t;       
    }       
    return (*s - *t);       
} 

4、strcat

char *strcat(char *strDes, const char *strSrc)       
{       
    assert((strDes != NULL) && (strSrc != NULL));       
    char *address = strDes;       
    while (*strDes != '\0')       
        ++ strDes;       
    while ((*strDes ++ = *strSrc ++) != '\0')       
        NULL;       
    return address;       
}

5、strlen

int strlen(const char *str)       
{       
    assert(str != NULL);       
    int len = 0;       
    while (*str ++ != '\0')       
        ++ len;       
    return len;       
}

 6、strstr

char *strstr(const char *strSrc, const char *str)       
{       
    assert(strSrc != NULL && str != NULL);       
    const char *s = strSrc;       
    const char *t = str;       
    for (; *strSrc != '\0'; ++ strSrc)       
    {       
        for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)       
            NULL;       
        if (*t == '\0')       
            return (char *) strSrc;       
    }       
    return NULL;       
}

7、strncat

char *strncat(char *strDes, const char *strSrc, unsigned int count)       
{       
    assert((strDes != NULL) && (strSrc != NULL));       
    char *address = strDes;       
    while (*strDes != '\0')       
        ++ strDes;       
    while (count -- && *strSrc != '\0' )       
        *strDes ++ = *strSrc ++;       
    *strDes = '\0';       
    return address;       
}

8、strncmp

int strncmp(const char *s, const char *t, unsigned int count)       
{       
    assert((s != NULL) && (t != NULL));       
    while (*s && *t && *s == *t && count --)       
    {       
        ++ s;       
        ++ t;       
    }       
    return (*s - *t);       
}

9、memcpy

void *memcpy(void *dest, const void *src, unsigned int count)       
{       
    assert((dest != NULL) && (src != NULL));       
    void *address = dest;       
    while (count --)       
    {       
        *(char *) dest = *(char *) src;       
        dest = (char *) dest + 1;       
        src = (char *) src + 1;       
    }       
    return address;       
}

10、memccpy

void *memccpy(void *dest, const void *src, int c, unsigned int count)       
{       
    assert((dest != NULL) && (src != NULL));       
    while (count --)       
    {       
        *(char *) dest = *(char *) src;       
        if (* (char *) src == (char) c)       
            return ((char *)dest + 1);       
        dest = (char *) dest + 1;       
        src = (char *) src + 1;       
    }       
    return NULL;       
}

11、memcmp

int memcmp(const void *s, const void *t, unsigned int count)       
{       
    assert((s != NULL) && (t != NULL));       
    while (*(char *) s && *(char *) t && *(char *) s == *(char *) t && count --)       
    {       
        s = (char *) s + 1;       
        t = (char *) t + 1;       
    }       
    return (*(char *) s - *(char *) t);       
} 

12、memmove

//@big:      
//要处理src和dest有重叠的情况,不是从尾巴开始移动就没问题了。      
//一种情况是dest小于src有重叠,这个时候要从头开始移动,      
//另一种是dest大于src有重叠,这个时候要从尾开始移动。      
void *memmove(void *dest, const void *src, unsigned int count)       
{      
    assert(dest != NULL && src != NULL);      
    char* pdest = (char*) dest;      
    char* psrc = (char*) src;      
    
    //pdest在psrc后面,且两者距离小于count时,从尾部开始移动. 其他情况从头部开始移动      
    if (pdest > psrc && pdest - psrc < count)       
    {      
        while (count--)       
        {      
            *(pdest + count) = *(psrc + count);      
        }      
    } else       
    {      
        while (count--)       
        {      
            *pdest++ = *psrc++;      
        }      
    }      
    return dest;      
} 

13、memset

void *memset(void *str, int c, unsigned int count)       
{       
    assert(str != NULL);       
    void *s = str;       
    while (count --)       
    {       
        *(char *) s = (char) c;       
        s = (char *) s + 1;       
    }       
    return str;       
}

14、atoi

//代码自己所写,不对地方请及时指正,谢谢!  
//inf用来标记作为判断是否越界  
//atoiFlag作为是否是正确结果的返回值  
const __int64 inf = (0x7fffffff);  
int atoiFlag;  
int atoi(const char* ch)  
{  
    ASSERT(ch != NULL);  
    atoiFlag = false;  
    while (*ch == ' ' || *ch == '\t')  
        ch ++;  
    int isMinus = 1;  
    if (*ch == '-')  
    {  
        isMinus = -1;  
        ch ++;  
    }  
    else if (*ch == '+')  
    {  
        ch ++;  
    }  
    //判断非法  
    if (!(*ch <= '9' && *ch >= '0'))  
        return 0;  
    __int64 ans = 0;  
    while (*ch && *ch <= '9' && *ch >= '0')  
    {  
        ans *= 10;  
        ans += *ch - '0';  
        //判断越界  
        if (ans > inf)  
        {  
            return inf;  
        }  
        ch ++;  
    }  
    ans *= isMinus;  
    atoiFlag = true;  
    return (int)ans;  
}  
  
//如何使用  
int main()  
{  
    char a[100];  
    while (scanf("%s", a) != EOF)  
    {  
        int ans = atoi(a);  
        if (atoiFlag)  
            printf("%d\n", ans);  
        else if (ans == inf)  
            puts("The data of crossing the line");  
        else  
            puts("Not is a integer");  
    }  
    return 0;  
} </span>

15、itoa

#include <stdlib.h>   
#include <stdio.h>   
char *myitoa(int num,char *str,int radix);  
int main()   
{   
    int number = -123456;   
    char string[25];   
    myitoa(number, string, 16);   
    printf("integer = %d string = %s\n", number, string);   
    return 0;   
}   
/* 实现itoa函数的源代码 */   
char *myitoa(int num,char *str,int radix)   
{    
    /* 索引表 */   
    char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";   
    unsigned unum; /* 中间变量 */   
    int i=0,j,k;   
    /* 确定unum的值 */   
    if(radix==10&&num<0) /* 十进制负数 */   
    {   
        unum=(unsigned)-num;   
        str[i++]='-';   
    }   
    else unum=(unsigned)num; /* 其他情况 */   
    /* 逆序 */   
    do    
    {   
        str[i++]=index[unum%(unsigned)radix];   
        unum/=radix;   
    }while(unum);   
    str[i]='\0';   
    /* 转换 */   
    if(str[0]=='-') k=1; /* 十进制负数 */   
    else k=0;   
    /* 将原来的“/2”改为“/2.0”,保证当num在16~255之间,radix等于16时,也能得到正确结果 */   
    char temp;   
    for(j=k;j<=(i-k-1)/2.0;j++)   
    {   
        temp=str[j];   
        str[j]=str[i-j-1];   
        str[i-j-1]=temp;   
    }   
    return str;   
}  





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值