1、strlen() sizeof()
    sizeof 为运算符,strlen为函数
    strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
    char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
    char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
    char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
  而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
    sizeof(aa) 返回10
    int a[10]; sizeof(a) 返回40
        sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
    sizeof还可以用函数做参数,比如:
    short f();   
    printf("%d\n", sizeof(f()));
  输出的结果是sizeof(short),即2。

 



2、strlen() strcpy() strcat() strcmp()实现
strlen(s) : 返回S的长度,不包括字符串结束符NULL;
strcmp(s1,s2) :比较两个字符串是否相同,若s1==s2,返回0,若s1>s2则返回正数,若s1<s2则返回负数;
strcat(s1,s2):将字符串s2连接到s1上,返回 s1;
strcpy(s1,s2):将s2,复制到s1,返回 s1.
 
1、自定义str库函数时,首先要明确接收的参数是否为空(assert),这样可有效避免bug;
2、对函数的参数要尽量多的应用const,以避免无意间修改了字符串。
3、要自行添加字符串的结束符‘\0’。
4、strcpy函数要注意会不会出现内存覆盖问题,对所传位置应进行判断。 出现内存覆盖则从后向前进行处理,没有出现则从前向后进行处理。或全部直接从后向前处理

 
 



3、memset() memcpy() memcmp() memmove()实现 内存覆盖问题
memset:
    void *(memset) (void *s,int c,size_t n)  
     {  
         const unsigned char uc = c;     
         unsigned char *su;  
         for(su = s;0 < n;++su,--n)  
             *su = uc;  
         return s;  
     } 
第3行把int类型的c转换成unsigned char类型,意味着截去c的高24位,只保留低8位。第4行把s当作unsigned char*类型,也就是说su中的每一个元素按8位计算。
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
其实这里面的ch就是ascii为ch的字符;
将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCLL值
memcpy:
  void *memcpy(void *dest, const void *src, size_t n);
  从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
  容易存在内存覆盖问题,所以在实现时应注意目标地址和源地址是否会产生冲突,
memmove
 原型:extern void *memmove(void *dest, const void *src, unsigned int count);
  用法:#include <string.h>
  功能:由src所指内存区域复制count个字节到dest所指内存区域。
  说明:src和dest所指内存区域可以重叠,但复制后src内容会被更改。函数返回指向dest的指针。
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确
memcmp:
int memcmp(const void *buf1, const void *buf2, unsigned int count);
memcmp是比较内存区域buf1和buf2的前count个字节。此函数是按字节进行比较的。
返回值
当buf1<buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0