• 字符串相关函数的实现


    strcpy和memcpy都是标准C库函数,它们有下面的特点。
    strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

    已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
    memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。

    void *memcpy( void *dest, const void *src, size_t count );

     考虑内存重叠的情况:(细节决定成败)

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    char *memorycpy(char *dest, char *src, int len)
    {
        if (!dest || !src ||!len || (dest == src))
        {
            return dest;
        }
    
        char *pdest = dest;
        char *psrc = src;
        //目标地址高于源地址,从后往前复制
        if (dest > src)
        {
            pdest = pdest + len - 1;
            psrc = psrc + len - 1;
            while(len--)
            {
                *pdest-- = *psrc--;
            }
        }
        else //反过来,从前向后复制
        {
            while(len--)
            {
                *pdest++ = *psrc++;
            }
        }
    
        return dest;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        char *s1 = new char[30];
        char *s2;
    
        for (int i = 0; i < 10; i++)
        {
            *(s1 + i) = 'a' + i;
        }
    
        s2 = s1 + 2;
    
        s2 = memorycpy(s2, s1, 3);
    
        cout << s2 << endl;
    
        delete [] s1;
    
        return 0;
    }
    char * strcpy(char * dest, const char * src) // 实现src到dest的复制
    {
      if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
      {
     
          return NULL;
      }
      char *strdest = dest;        //保存目标字符串的首地址
      while ((*strDest++ = *strSrc++)!=''); //把src字符串的内容复制到dest下
      return strdest;
    }

    strcpy和memcpy主要有以下3方面的区别。
    1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
    2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符""才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
    3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

    void* memset(void* buf,int c,size_t count) 
    { 
        if(buf == NULL)
            return  NULL; 
    
         char* pvTo = (char*)buf; 
    
        while (count-- >0) 
        { 
            *pvTo++ = (char)c; 
        } 
    
        return buf; 
    }
    int strcmp(char * src,char *dest)
    {
    if( src == NULL || dest == NULL )
    return ERROR;
    while ( *src != '' && *dest != '' && *src == *dest ) { src++; dest++; } if( (*src - *dest) > 0 ) return 1; else if ( (*src - *dest) < 0) return -1; else return 0; }
    char *strcat(char *s1,const char *s2)
    {
        if ( s1 == NULL || s2 == NULL )
                return NULL;
    
        char *address=s1;
        while(*s1++);
        s1--;
    
        while(*s1++=*s2++); 
       
        return address;
    }        
    int atoi (char *s)
    {
    if ( s == NULL )
    return ERROR;
    int sign=1,num=0; if(*s=='-') sign=-1; s++; while((*s)!='') { num=num*10+(*s-'0'); s++; } return num*sign; }
    //num : 欲转换的数值 
    //des : 目标字符串的地址
    //radix : 转换后的进制数,可以是10进制、16进制等
    // 暂未考虑负数的转化成字符串
    char *itoa(int num, char *des, int radix)
    {
    if ( NULL == des )
    return NULL;
    const char string[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char* ptr = des;
    int j = 0; while (num) { *ptr++ = string[num % radix]; num /= radix; if (num < radix) { *ptr++ = string[num]; *ptr = ''; break; } } j = ptr - des - 1; for (int i = 0; i < (ptr - des) / 2; i++) { int temp = des[i]; des[i] = des[j]; des[j--] = temp; } return des; }
  • 相关阅读:
    [LeetCode]*124.Binary Tree Maximum Path Sum
    HDU3336-Count the string(KMP)
    各种配置环境变量总结
    数据结构与算法-为什么要使用算法
    request 对象
    Codeforces 15B Laser
    使用jq工具在Shell命令行处理JSON数据
    Android中的FrameLayout帧布局
    iOS 8 设置导航栏的背景颜色和背景图片
    Creating HTML table with vertically oriented text as table header 表头文字方向
  • 原文地址:https://www.cnblogs.com/theCambrian/p/3612377.html
Copyright © 2020-2023  润新知