经典源代码

#include <iostream>
#include <cstdio>
// #include <cstring>
size_t mystrlen( const char * str );
char * mystrcat( char * dst,  const char * src );
char * mystrcpy(char * dst, const char * src);
int mystrcmp ( const char * src, const char * dst );
const int SIZE = 512;
using namespace std;
int main()
{
    char str[]="0123456789ABCDEF";
    int len = mystrlen(str);
    cout << str <<endl <<"len: " <<len << endl;
    char name[SIZE] ;
    char *title = name;
    printf( "输入你的名字: " );
    scanf( "%s", name );
    title = mystrcat( name, " 大帅哥" );
    printf( "Hello, %s/n", title );
    title = mystrcpy( name, "你也是大帅哥" );
    printf( "Hello, %s/n", title );
    int equal = mystrcmp(name, "你也是大帅哥");
    if(equal == 0)
        cout<<"我们都是大帅哥/n";
    cout <<"equal=: "<< equal;
    return 0;
}
// VC6.0 的C Runtime Library源代码
// 目录 CRT/SRC/ 中的  STRLEN.C  STRNCAT.C  STRCMP.C
size_t mystrlen( const char * str )
{
    const char *eos = str;
    while( *eos++ ) ;
    return( (int)(eos - str - 1) );
}
char * mystrcat( char * dst,  const char * src )
{
    char * cp = dst;
    while( *cp )
        cp++;                   /* find end of dst */
    while( *cp++ = *src++ )  ;   /* Copy src to end of dst */
    /*  实际把这句 while( *cp++ = *src++) 拆开
        首先*cp = *src 赋值,然后判断表达式的值while(*cp)
        然后自增cp++, src++ 所以,整个表达式的结束判断就在于while(*cp)
        如果*cp== '/0 ',因为 '/0 '对应的ascii码就是0,所以判断就为假,也就退出循环了*/
    return( dst );                  /* return dst */
}
char * mystrcpy(char * dst, const char * src)
{
    char * cp = dst;
    while( *cp++ = *src++ )  ; /* Copy src over dst  参考上面mystrcat */
    return( dst );
}
int mystrcmp ( const char * src, const char * dst )
{
    int ret = 0 ;
    // 比较 *src - *dst ,如果相等就 ret=0 ;
    // !ret && *dst ,循环结束条件(*src不等于*dst),*dst 结束标志"/0'
    while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
        ++src, ++dst;
    if ( ret < 0 )
        ret = -1 ;
    else if ( ret > 0 )
        ret = 1 ;
    return( ret ); //
}


#include <iostream>
#include <string.h>
#include <stdio.h>
void * my_memcpy(void * dst, const void * src, size_t count);
int my_memcmp(const void * buf1, const void * buf2, size_t count);
void * my_memchr(const void * buf, int chr, size_t cnt);
int main()
{
    using namespace std;

    char str1[] = "Sample string";
    char *ps = new char[40];

    my_memcpy(ps, str1, strlen(str1) + 1);
    cout << ps << endl; // 复制成功

    ps[5] = 'E'; // 修改第6个字符
    bool cmp_ret = my_memcmp(str1, ps, 5);
    cout << "前五个字符比较: " << cmp_ret << "\t(返回0为相同)" << endl;
    cout << "整个字符串比较: " << my_memcmp(str1, ps, strlen(str1)) << "\t(返回非0为不同)" << endl;

    char * pch;
    pch = (char *)my_memchr(ps, 's', strlen(str1));
    printf("在%s中寻找'E',找到的位置为: 第 %d 个字符\n" , ps , pch - ps + 1);
    printf("指针ps 的地址: %X \n找到's'的地址:%X \n" , (unsigned int) ps, (unsigned int) pch);
    delete[] ps;
    return 0;
}

void * my_memcpy(void * dst, const void * src, size_t count)
{
    void * ret = dst;
    // 如果CPU可以优化 调用 RtlMoveMemory( dst, src, count );
    // 按字节复制从低地址向高地址
    while (count--) {  // 倒数计数器
        *(char *)dst = *(char *)src;  // 按字节复制
        dst = (char *)dst + 1;        // 把指针按字节(char *)增加1
        src = (char *)src + 1;
    }
    return(ret);
}

int my_memcmp(const void * buf1, const void * buf2, size_t count)
{
    if (!count)
        return(0);
    // 按字节比较从低地址向高地址,如果不同,退出while
    while (--count && *(char *)buf1 == *(char *)buf2) {  // 倒数计数器 --count
        buf1 = (char *)buf1 + 1;      // 把指针按字节(char *)增加1
        buf2 = (char *)buf2 + 1;
    }
    return(*((unsigned char *)buf1) - *((unsigned char *)buf2));  // 按无符号字符指针解应用比较
}

void * my_memchr(const void * buf, int chr, size_t cnt)
{
    // 函数在buf指向的数组的cnt个字符的字符串里查找chr 首次出现的位置
    while (cnt && (*(unsigned char *)buf != (unsigned char)chr)) {
        buf = (unsigned char *)buf + 1;  // 把指针按字节(unsigned char *)增加1
        cnt--;
    }
    return(cnt ? (void *)buf : NULL);
}



http://topic.csdn.net/u/20110801/14/d07519ec-559f-4bdb-ba88-d6102eb3a7d3.html


http://srgb.googlecode.com/files/VC2008_CRT_SRC.7z
http://srgb.googlecode.com/files/cplusplus-2010-12-10.chm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值