zoukankan      html  css  js  c++  java
  • 字符串相关函数的实现

    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; }
  • 相关阅读:
    第4月第1天 makefile automake
    第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash
    第3月第27天 uitableviewcell复用
    learning uboot fstype command
    learning uboot part command
    linux command dialog
    linux command curl and sha256sum implement download verification package
    learning shell script prompt to run with superuser privileges (4)
    learning shell get script absolute path (3)
    learning shell args handing key=value example (2)
  • 原文地址:https://www.cnblogs.com/theCambrian/p/3612377.html
Copyright © 2011-2022 走看看