VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 4768|回复: 8

[转]手动实现的C语言string.h 头文件的字符串函数

[复制链接]
 楼主| 发表于 2010-8-16 16:32:45 | 显示全部楼层 |阅读模式
本帖最后由 VBProFan 于 2010-8-16 17:03 编辑

from:http://www.yqshare.com/string-h-fuction.html


  1. 001 #include<stdio.h>  
  2. 002 char* strcpy(char* dest,const char* src);  //字符串拷贝  
  3. 003 char* strcat(char* dest,const char* src);  //字符串连接,返回dest字符串  
  4. 004 char* strncat(char* dest, const char* src, int size);//把src前n个字符串连接到dest,返回dest字符串  
  5. 005 int   strcmp(const char* src1,const char* src2);  //字符串比较  返回值: 1:> 0:= -1<  
  6. 006 int   strncmp(const char* src,const char* dst,int size);  //dst前n个字符和src比较返回值: 1:>  0:=  -1<  
  7. 007 int   strlen(const char* src);  //返回字符串长度  
  8. 008 char* strchr(const char* src, int ch); //字符ch在字符串第一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针  
  9. 009 char* strrchr(const char* src, int ch); //字符ch在字符串最后一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针  
  10. 010 char* strstr(const char* src, const char* sub); //字符串sub在字符串第一次出现的位置,返回出现字符串sub位置开始到字符串结束位置的指针  
  11. 011 //memery copy operate function==================//  
  12. 012 void* memcpy(void* dest,const void* src,unsigned int size); //把src的内容拷到dest内存里去,并返回dest指向的内存地址  
  13. 013 void* memset(void* dst, int ch, unsigned int size); //把dst内存中的size大小用使用ch来初始化,并返回dest指向的内存地址  
  14. 014 int   memcmp(const void* src1, const void* src2, unsigned int size); //比较内存中src1与src2中的前size 个字符是否相等,1:>  0:=  -1<  (see strncmp(const char*,const char*,unsigned int))  
  15. 015 void* memchr(const void* dst, int ch, unsigned int size); //在内存中的某一范围内,查找特定的字符ch,并返回指向ch的指针  
  16. 016 void* memmove(void* dst, const void* src, unsigned int size); //memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些.返回指向dest的指针  
  17. 017 //memery copy operate function==================//  
  18. 018   
  19. 019 int main()  
  20. 020 {  
  21. 021 // printf("the string len=%d\n",strlen("helloWorld"));   
  22. 022   
  23. 023 // char dest[20];  
  24. 024 // printf("the string is=%s\n",strcpy(dest,"helloWorld"));  
  25. 025 // char dest[30]="hello--";  
  26. 026 // printf("after connect sub string is=%s\n",strcat(dest,"world"));  
  27. 027 // char dest[30]="hello--";  
  28. 028 // printf("after connect sub string is=%s\n",strncat(dest,"world_programe",4));  
  29. 029   
  30. 030 // printf("the string compare result is=%d\n",strcmp("hello","aello"));  
  31. 031 // printf("the string compare result is=%d\n",strncmp("hello","hello_good",5));  
  32. 032 // printf("the char appear position is=%s\n",strchr("hello-r-es-d",'-'));  
  33. 033 // printf("the char appear position is=%s\n",strrchr("hel*lo-r*-e*s-d",'*'));  
  34. 034   
  35. 035 // printf("the sub string is=%s\n",strstr("hello_world","lo"));  
  36. 036  char dest[20];  
  37. 037 // printf("the sub string is=%s\n",memcpy(dest,"hello..111",sizeof(dest)));  
  38. 038  printf("the sub string is=%s\n",memset(dest,'0',sizeof(dest)));  
  39. 039   
  40. 040  return 0;  
  41. 041 }  
  42. 042 //=========================================================//  
  43. 043 int  strlen(const char* src)  
  44. 044 {  
  45. 045  const char* p=src;  
  46. 046  while(*p++!='\0');  
  47. 047  return p-src-1;  
  48. 048 }  
  49. 049 //=========================================================//  
  50. 050 char* strcpy(char* dest,const char* src)  
  51. 051 {  
  52. 052  if(dest&&src)  
  53. 053  {  
  54. 054   int i=0;  
  55. 055   while((*(dest+i)=*(src+i))!='\0') i++;  
  56. 056   *(dest+i)='\0';  
  57. 057  // return dest;  
  58. 058  }  
  59. 059  return dest;  
  60. 060 }  
  61. 061 //=========================================================//  
  62. 062 char* strcat(char* dest,const char* src)  
  63. 063 {  
  64. 064  if(dest&&src)  
  65. 065  {  
  66. 066   int len=strlen(dest);  
  67. 067  // printf("len=%d\n",len);  
  68. 068   int i=0;  
  69. 069   while((*(dest+len+i)=*(src+i))!='\0') i++;  
  70. 070   *(dest+len+i)='\0';  
  71. 071  }  
  72. 072  return dest;  
  73. 073 }  
  74. 074 //=========================================================//  
  75. 075 char* strncat(char* dest, const char* src, int size)  
  76. 076 {  
  77. 077  if(dest&&src)  
  78. 078  {  
  79. 079   int len=strlen(dest);  
  80. 080   int i=0;  
  81. 081   while((i<size)&&((*(dest+len+i)=*(src+i))!='\0')) i++;  
  82. 082  }  
  83. 083  return dest;  
  84. 084 }  
  85. 085 //=========================================================//  
  86. 086 int strcmp(const char* src1,const char* src2)  
  87. 087 {  
  88. 088  int equal;  
  89. 089  int i=0;  
  90. 090  while(!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))  
  91. 091   i++;  
  92. 092  if(equal<0) return -1;  
  93. 093  else if(equal>0) return 1;  
  94. 094  else return 0;  
  95. 095 }  
  96. 096 //=================比较两个字符串前size 个字符串是否相等==========================//  
  97. 097 int strncmp(const char* src1,const char* src2,int size)  
  98. 098 {  
  99. 099  int equal;  
  100. 100  int i=0;  
  101. 101  while((i<size)&&!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))  
  102. 102   i++;  
  103. 103  if(equal<0) return -1;  
  104. 104  else if(equal>0) return 1;  
  105. 105  else return 0;  
  106. 106 }  
  107. 107 //=========================================================//  
  108. 108 char* strchr(const char* src, int ch)  
  109. 109 {  
  110. 110  int i=0;  
  111. 111  while(*(src+i)&&(*(src+i)!=ch)) i++;  
  112. 112  return (char*)(src+i);  
  113. 113 }  
  114. 114 //=========================================================//  
  115. 115 char* strrchr(const char* src, int ch)  
  116. 116 {  
  117. 117  int len=strlen(src);  
  118. 118  int i=0;  
  119. 119  while(i<len&&(*(src+len-i)!=ch)) i++;  
  120. 120  return (char*)(src+(len-i));  
  121. 121 }  
  122. 122 //=========================================================//  
  123. 123 char* strstr(const char* src, const char* sub)  
  124. 124 {  
  125. 125  if(src&&sub)  
  126. 126  {  
  127. 127   int subLen=strlen(sub);  
  128. 128   int srcLen=strlen(src);  
  129. 129   int nomatch=1;  
  130. 130   int fds=srcLen-subLen+1;  
  131. 131   int i=0;  
  132. 132   if(fds>0) //find counts in the string  
  133. 133    while((nomatch=strncmp(src+i,sub,subLen))&&fds--)//把当前src的指针往后推,直到找到与sub指针相同为止  
  134. 134     i++;  
  135. 135   if(nomatch)  
  136. 136    return 0;  
  137. 137   else
  138. 138    return (char*)(src+i);  
  139. 139  }  
  140. 140  return 0;  
  141. 141 }  
  142. 142 //====================memory operate=====================================//  
  143. 143 //====================memory operate=====================================//  
  144. 144 void* memcpy(void* dest,const void* src,unsigned int size)  
  145. 145 {  
  146. 146  if(dest&&src&&size>0)  
  147. 147  {  
  148. 148   int i=0;  
  149. 149      unsigned char* p=(unsigned char*)dest;  
  150. 150   unsigned char* q=(unsigned char*)src;  
  151. 151   while((i<size)&&(*(p+i)=*(q+i)))  
  152. 152    i++;  
  153. 153   return dest;  
  154. 154  }  
  155. 155  return 0;  
  156. 156 }  
  157. 157 //=========================================================//  
  158. 158 void* memset(void* dst, int ch, unsigned int size)  
  159. 159 {  
  160. 160  int i=0;  
  161. 161  unsigned char* p=(unsigned char*)dst;  
  162. 162  while((i<size)&&(*(p+i)=ch))  
  163. 163   i++;  
  164. 164  return dst;  
  165. 165 }  
  166. 166 //=========================================================//  
  167. 167 int  memcmp(const void* src1, const void* src2, unsigned int size)  
  168. 168 {  
  169. 169 }  
  170. 170 //=========================================================//  
  171. 171 void* memchr(const void* dst, int ch, unsigned int size)  
  172. 172 {  
  173. 173 }  
  174. 174 void* memmove(void* dst, const void* src, unsigned int count)  
  175. 175 {  
  176. 176    void * ret = dst;  
  177. 177    if (dst <= src || (char *)dst >= ((char *)src + count))  
  178. 178    {  
  179. 179       while (count--)  
  180. 180       {  
  181. 181         *(char *)dst = *(char *)src;  
  182. 182             dst = (char *)dst + 1;  
  183. 183             src = (char *)src + 1;  
  184. 184         }  
  185. 185    }  
  186. 186    else
  187. 187    {  
  188. 188       dst = (char *)dst + count - 1;  
  189. 189       src = (char *)src + count - 1;  
  190. 190       while (count--)  
  191. 191       {  
  192. 192         *(char *)dst = *(char *)src;  
  193. 193         dst = (char *)dst - 1;  
  194. 194         src = (char *)src - 1;  
  195. 195       }  
  196. 196    }  
  197. 197    return(ret);  
  198. 198   
  199. 199 }
复制代码
发表于 2010-8-16 19:34:48 | 显示全部楼层
不知有何意义?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-16 22:38:52 | 显示全部楼层
本帖最后由 VBProFan 于 2010-8-16 22:42 编辑

用于应付面试题。因为有很多考官都喜欢考这类题,其中最多的是 strcpy,我从本科毕业找工到硕士毕业找工到工作一年后找工一共被考了4~5次。
回复 支持 反对

使用道具 举报

发表于 2010-8-16 23:59:49 | 显示全部楼层
3# VBProFan

他问你标准实现是怎么实现的?还是只要给一个对的程序就可以了?
回复 支持 反对

使用道具 举报

发表于 2010-8-17 00:01:20 | 显示全部楼层
while(((*(dst++))=(*(src++)))!='\0'); 这样?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-17 12:44:29 | 显示全部楼层
就是要你自己写一个 strcpy,当然不能调用库函数。
你那个还有点不完善。

编写strcpy 函数(10分)

已知strcpy 函数的原型是

char *strcpy(char *strDest, const char *strSrc);

其中strDest 是目的字符串,strSrc 是源字符串。
(1)不调用C++/C 的字符串库函数,请编写函数 strcpy
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++) != ‘\0’ ) // 2分
NULL ;
return address ; // 2分
}
(2)strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了实现链式表达式。 // 2 分
例如 int length = strlen( strcpy( strDest, “hello world”) );
回复 支持 反对

使用道具 举报

发表于 2010-8-17 21:08:04 | 显示全部楼层
6# VBProFan

assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
标准库函数可没这个语句,不信你自己试一下,直接非法操作完事……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-18 12:58:15 | 显示全部楼层
那就手工实现咯,反正他的意思是要检查参数是否为特殊值。
回复 支持 反对

使用道具 举报

发表于 2010-8-18 15:01:55 | 显示全部楼层
assert是M$ VC++专用的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-3-22 05:36

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表