zoukankan      html  css  js  c++  java
  • H面试程序(0):字符串一些常用函数的实现

    1、Strcat函数原型如下:

    char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数
    {
           char * address = strDest;             //该语句若放在assert之后,编译出错
           assert((strDest != NULL) && (strScr != NULL)); //对源地址和目的地址加非0断言
           while(*strDest)             //是while(*strDest!=’’)的简化形式
           {                        //若使用while(*strDest++),则会出错,因为++是不受循环
                  strDest++;               //约束的。所以要在循环体内++;因为要是*strDest最后指
           }                        //向该字符串的结束标志’’。
           while(*strDest++ = *strScr++) 
           {
                  NULL;                 //该循环条件内可以用++,
           }                          //此处可以加语句*strDest=’’;有无必要?
    return address;               //为了实现链式操作,将目的地址返回
    }


     

    2、Strcpy函数原型如下:

    char *strcpy(char *strDest, const char *strScr)
    {
           char *address=strDest;
           assert((strDest != NULL) && (strScr != NULL));
           while(*strScr)                   //是while(*strScr != ’’)的简化形式;
           {
                  *strDest++ = *strScr++;
           }
           *strDest = '';                       //当strScr字符串长度小于原strDest字符串长度
           return address;                      //时,如果没有改语句,就会出错了。
    }


    3、Strcmp函数原型如下:

    int strcmp (const char *str1,const char *str2)
    {           
           int len = 0;
           assert((str1 != '') && (str2 != ''));
           while(*str1 && *str2 && (*str1 == *str2))
           {
                  str1++;
                  str2++;
           }
           return *str1-*str2;
    }


    4、Strlen函数原型如下:

    int strlen(const char *str)
    {
        int len = 0;
           assert(str != NULL);
           while(*str++)
           {
                  len++;
           }
           return len;
    }


    5、memcpy函数

    函数原型:void *memmove(void *dest, const void *source, size_t count)

    返回值说明:返回指向dest的void *指针

    参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

    函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

    void *memcpy(void *dest, const void *source, size_t count)
    {
       assert((NULL != dest) && (NULL != source));
       char *tmp_dest = (char *)dest;
       char *tmp_source = (char *)source;
       while(count --)//不对是否存在重叠区域进行判断
           *tmp_dest ++ = *tmp_source ++;
       return dest;
    }


     

    6、memmove函数

    函数原型:void *memcpy(void *dest, const void *source, size_t count);

    返回值说明:返回指向dest的void *指针

    函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

    函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。而memmove(),如果两函数重叠,赋值仍正确进行。

    memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy。 如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。

    void *memmove(void *dest, const void *source, size_t count)
    {
       assert((NULL != dest) && (NULL != source));
       char *tmp_source, *tmp_dest;
       tmp_source = (char *)source;
       tmp_dest = (char *)dest;
       if((dest + count<source) || (source + count) <dest))
       {// 如果没有重叠区域
           while(count--)
           *tmp_dest++ = *tmp_source++;
       }
      else
      { //如果有重叠,反向拷贝。以避免源字符串被部分目的字符串覆盖
         tmp_source += count - 1;
         tmp_dest += count - 1;
         while(count--)
           *--tmp_dest = *--tmp;
      }
      
      return dest;
    }

    7.atoi

    原型: int atoi(const char *nptr);

    函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。

    #include <stdio.h>
    #include <assert.h>
    static int atoi(const char* str)
    {
        int result = 0;
        int sign = 0;
        assert(str != NULL);
        // proc whitespace characters
        while (*str==' ' || *str=='	' || *str=='
    ')
            ++str;
    
        // proc sign character
        if (*str=='-')
        {
            sign = 1;
            ++str;
        }
        else if (*str=='+')
        {
            ++str;
        }
    
        // proc numbers
        while (*str>='0' && *str<='9')
        {
            result = result*10 + *str - '0';
            ++str;
        }
    
        // return result
        if (sign==1)
           return -result;
        else
           return result;
    }


     

    7. itoa

    char *itoaint value, char *string,int radix);

    原型说明:

    value欲转换的数据。

    string:目标字符串的地址。

    radix:转换后的进制数,可以是10进制、16进制等

    char *itoa(int val, char *buf, unsigned radix)
    {
        char   *p;             
        char   *firstdig;      
        char   temp;           
        unsigned   digval;     
        p = buf;
        if(val <0)
        {
            *p++ = '-';
            val = (unsigned long)(-(long)val);
        }
        firstdig = p; 
        do{
            digval = (unsigned)(val % radix);
            val /= radix;
           
            if  (digval > 9)
                *p++ = (char)(digval - 10 + 'a'); 
            else
                *p++ = (char)(digval + '0');      
        }while(val > 0);
       
        *p-- = ' ';         
        do{
            temp = *p;
            *p = *firstdig;
            *firstdig = temp;
            --p;
            ++firstdig;        
        }while(firstdig < p);  
        return buf;
    }


     


     

  • 相关阅读:
    Java [Leetcode 319]Bulb Switcher
    Java [Leetcode 122]Best Time to Buy and Sell Stock II
    谱聚类算法
    Java [Leetcode 238]Product of Array Except Self
    Java [Leetcode 260]Single Number III
    X++ StrFix方法
    D365 FO第三方访问https证书问题
    D365 FO 使用.NET DLL
    D365 FO第三方集成(四)---客户端调用
    D365 FO第三方集成(三)---服务实现
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3253799.html
Copyright © 2011-2022 走看看