现在的位置: 首页 > 综合 > 正文

H面试程序(0):字符串一些常用函数的实现 H面试程序(0):字符串一些常用函数的实现

2017年09月29日 ⁄ 综合 ⁄ 共 4827字 ⁄ 字号 评论关闭

H面试程序(0):字符串一些常用函数的实现

分类: C/C++ H面试 321人阅读 评论(0) 收藏 举报

1、Strcat函数原型如下:

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

 

2、Strcpy函数原型如下:

  1. char *strcpy(char *strDest, const char *strScr)  
  2. {  
  3.        char *address=strDest;  
  4.        assert((strDest != NULL) && (strScr != NULL));  
  5.        while(*strScr)                   //是while(*strScr != ’\0’)的简化形式;  
  6.        {  
  7.               *strDest++ = *strScr++;  
  8.        }  
  9.        *strDest = '\0';                       //当strScr字符串长度小于原strDest字符串长度  
  10.        return address;                      //时,如果没有改语句,就会出错了。  
  11. }  

3、Strcmp函数原型如下:

  1. int strcmp (const char *str1,const char *str2)  
  2. {             
  3.        int len = 0;  
  4.        assert((str1 != '\0') && (str2 != '\0'));  
  5.        while(*str1 && *str2 && (*str1 == *str2))  
  6.        {  
  7.               str1++;  
  8.               str2++;  
  9.        }  
  10.        return *str1-*str2;  
  11. }  

4、Strlen函数原型如下:

  1. int strlen(const char *str)  
  2. {  
  3.     int len = 0;  
  4.        assert(str != NULL);  
  5.        while(*str++)  
  6.        {  
  7.               len++;  
  8.        }  
  9.        return len;  
  10. }  

5、memcpy函数

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

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

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

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

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

 

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。

  1. void *memmove(void *dest, const void *source, size_t count)  
  2. {  
  3.    assert((NULL != dest) && (NULL != source));  
  4.    char *tmp_source, *tmp_dest;  
  5.    tmp_source = (char *)source;  
  6.    tmp_dest = (char *)dest;  
  7.    if((dest + count<source) || (source + count) <dest))  
  8.    {// 如果没有重叠区域  
  9.        while(count--)  
  10.        *tmp_dest++ = *tmp_source++;  
  11.    }  
  12.   else  
  13.   { //如果有重叠,反向拷贝。以避免源字符串被部分目的字符串覆盖  
  14.      tmp_source += count - 1;  
  15.      tmp_dest += count - 1;  
  16.      while(count--)  
  17.        *--tmp_dest = *--tmp;  
  18.   }  
  19.     
  20.   return dest;  
  21. }  

7.atoi

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

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

  1. #include <stdio.h>  
  2. #include <assert.h>  
  3. static int atoi(const char* str)  
  4. {  
  5.     int result = 0;  
  6.     int sign = 0;  
  7.     assert(str != NULL);  
  8.     // proc whitespace characters  
  9.     while (*str==' ' || *str=='\t' || *str=='\n')  
  10.         ++str;  
  11.   
  12.     // proc sign character  
  13.     if (*str=='-')  
  14.     {  
  15.         sign = 1;  
  16.         ++str;  
  17.     }  
  18.     else if (*str=='+')  
  19.     {  
  20.         ++str;  
  21.     }  
  22.   
  23.     // proc numbers  
  24.     while (*str>='0' && *str<='9')  
  25.     {  
  26.         result = result*10 + *str - '0';  
  27.         ++str;  
  28.     }  
  29.   
  30.     // return result  
  31.     if (sign==1)  
  32.        return -result;  
  33.     else  
  34.        return result;  
  35. }  

 

7. itoa

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

  原型说明:

  value欲转换的数据。

  string:目标字符串的地址。

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

  1. char *itoa(int val, char *buf, unsigned radix)  
  2. {  
  3.     char   *p;               
  4.     char   *firstdig;        
  5.     char   temp;             
  6.     unsigned   digval;       
  7.     p = buf;  
  8.     if(val <0)  
  9.     {  
  10.         *p++ = '-';  
  11.         val = (unsigned long)(-(long)val);  
  12.     }  
  13.     firstdig = p;   
  14.     do{  
  15.         digval = (unsigned)(val % radix);  
  16.         val /= radix;  
  17.          
  18.         if  (digval > 9)  
  19.             *p++ = (char)(digval - 10 + 'a');   
  20.         else  
  21.             *p++ = (char)(digval + '0');        
  22.     }while(val > 0);  
  23.      
  24.     *p-- = '\0 ';           
  25.     do{  
  26.         temp = *p;  
  27.         *p = *firstdig;  
  28.         *firstdig = temp;  
  29.         --p;  
  30.         ++firstdig;          
  31.     }while(firstdig < p);    
  32.     return buf;  
  33. }  

抱歉!评论已关闭.