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!=’\0’)的简化形式

       {                        //若使用while(*strDest++),则会出错,因为++是不受循环

              strDest++;               //约束的。所以要在循环体内++;因为要是*strDest最后指

       }                        //向该字符串的结束标志’\0’。

       while(*strDest++ = *strScr++) 

       {

              NULL;                 //该循环条件内可以用++,

       }                          //此处可以加语句*strDest=’\0’;有无必要?

return address;               //为了实现链式操作,将目的地址返回

}


 

2、Strcpy函数原型如下:

char *strcpy(char *strDest, const char *strScr)

{

       char *address=strDest;

       assert((strDest != NULL) && (strScr != NULL));

       while(*strScr)                   //是while(*strScr != ’\0’)的简化形式;

       {

              *strDest++ = *strScr++;

       }

       *strDest = '\0';                       //当strScr字符串长度小于原strDest字符串长度

       return address;                      //时,如果没有改语句,就会出错了。

}


3、Strcmp函数原型如下:

int strcmp (const char *str1,const char *str2)

{           

       int len = 0;

       assert((str1 != '\0') && (str2 != '\0'));

       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字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。

#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=='\t' || *str=='\n')

        ++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-- = '\0 ';         

    do{

        temp = *p;

        *p = *firstdig;

        *firstdig = temp;

        --p;

        ++firstdig;        

    }while(firstdig < p);  

    return buf;

}


 

 


 

 

你可能感兴趣的:(常用函数)