首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

共享代码:VC6.0光盘上的实用源代码认读,新手看懂了,可以提高代码风格解决方案

2012-03-16 
共享代码:VC6.0光盘上的实用源代码认读,新手看懂了,可以提高代码风格C/C++ code#include iostream#inclu

共享代码:VC6.0光盘上的实用源代码认读,新手看懂了,可以提高代码风格

C/C++ code
#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.Csize_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 ); //}




C/C++ code
#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);} 




[解决办法]

[解决办法]

[解决办法]

[解决办法]
本来提高编程水平的捷径之一就是“阅读和模仿经典源代码”。
[解决办法]
偶也借此宝地显摆一段:【这里没有城管撵摆小摊的吧(^_^)】
C/C++ code
//定义下面5种运算顺序:// ((A   @   B)  @   C)  @   D//  (A   @   B)  @  (C   @   D)//  (A   @  (B   @   C)) @   D//   A   @ ((B   @   C)  @   D)//   A   @  (B   @  (C   @   D))//23.99<计算结果<24.01//其中://1≤A、B、C、D≤13//@为“+、-、*、/”之一//用浮点数计算,循环遍历以上所有情况即可。//这样算的虽然还是有重复,但比前一个算法更全。比如5*(5-1/5)=24就有。#include <stdio.h>int A,B,C,D,N;float r,r1,r2;char op1,op2,op3;char opc[4]={'+','-','*','/'};void main() {    N=0;    for (A=1;A<=13;A++) {    for (B=1;B<=13;B++) {    for (C=1;C<=13;C++) {    for (D=1;D<=13;D++) {    for (op1=0;op1<4;op1++) {    for (op2=0;op2<4;op2++) {    for (op3=0;op3<4;op3++) {        // ((A   @   B)  @   C)  @   D        r=(float)A;        switch (op1) {case 0:r=r+B   ;break;case 1:r=r-B   ;break;case 2:r=r*B   ;break;case 3:r=r/B   ;break;}        switch (op2) {case 0:r=r+C   ;break;case 1:r=r-C   ;break;case 2:r=r*C   ;break;case 3:r=r/C   ;break;}        switch (op3) {case 0:r=r+D   ;break;case 1:r=r-D   ;break;case 2:r=r*D   ;break;case 3:r=r/D   ;break;}        if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}        //  (A   @   B)  @  (C   @   D)        r1=(float)A;        switch (op1) {case 0:r1=r1+B ;break;case 1:r1=r1-B ;break;case 2:r1=r1*B ;break;case 3:r1=r1/B ;break;}        r2=(float)C;        switch (op3) {case 0:r2=r2+D ;break;case 1:r2=r2-D ;break;case 2:r2=r2*D ;break;case 3:r2=r2/D ;break;}        switch (op2) {case 0:r=r1+r2 ;break;case 1:r=r1-r2 ;break;case 2:r=r1*r2 ;break;case 3:if (-0.01<r2 && r2<0.01) goto STEP3; r=r1/r2 ;break;}        if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}        //  (A   @  (B   @   C)) @   D    STEP3:        r=(float)B;        switch (op2) {case 0:r=r+C   ;break;case 1:r=r-C   ;break;case 2:r=r*C   ;break;case 3:r=r/C   ;break;}        switch (op1) {case 0:r=A+r   ;break;case 1:r=A-r   ;break;case 2:r=A*r   ;break;case 3:if (-0.01<r  && r <0.01) goto STEP4; r=A/r   ;break;}        switch (op3) {case 0:r=r+D   ;break;case 1:r=r-D   ;break;case 2:r=r*D   ;break;case 3:r=r/D   ;break;}        if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}        //   A   @ ((B   @   C)  @   D)    STEP4:        r=(float)B;        switch (op2) {case 0:r=r+C   ;break;case 1:r=r-C   ;break;case 2:r=r*C   ;break;case 3:r=r/C   ;break;}        switch (op3) {case 0:r=r+D   ;break;case 1:r=r-D   ;break;case 2:r=r*D   ;break;case 3:r=r/D   ;break;}        switch (op1) {case 0:r=A+r   ;break;case 1:r=A-r   ;break;case 2:r=A*r   ;break;case 3:if (-0.01<r  && r <0.01) goto STEP5; r=A/r   ;break;}        if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}        //   A   @  (B   @  (C   @   D))    STEP5:        r=(float)C;        switch (op3) {case 0:r=r+D   ;break;case 1:r=r-D   ;break;case 2:r=r*D   ;break;case 3:r=r/D   ;break;}        switch (op2) {case 0:r=B+r   ;break;case 1:r=B-r   ;break;case 2:r=B*r   ;break;case 3:if (-0.01<r  && r <0.01) continue;   r=B/r   ;break;}        switch (op1) {case 0:r=A+r   ;break;case 1:r=A-r   ;break;case 2:r=A*r   ;break;case 3:if (-0.01<r  && r <0.01) continue;   r=A/r   ;break;}        if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}    }    }    }    }    }    }    }}//用时0.27秒//     1: (( 1+ 1)+ 1)* 8=24//     2: ( 1+( 1+ 1))* 8=24//     3: ( 1+ 1)*( 1+11)=24// ... ...// 53280: (13+13)/(13/12)=24// 53281: (13-(13/13))+12=24// 53282: 13-((13/13)-12)=24 


[解决办法]
注释有点太多,这也不是好风格
[解决办法]
楼主还是先找本《代码大全》第二版看看吧
[解决办法]
很好,学习了。
[解决办法]
我想知道lz的图是用什么画的
[解决办法]
Mark!
[解决办法]
这个工作确实很有意义!
[解决办法]
顶一个
[解决办法]
LZ的代码底色咋弄的?

热点排行