天天看点

mystrlen, mystrcpy, mystrcat, mystrcmp, mystrchr, mystrstr 实现.

     面试过程中,经常碰到的一类基础编程题是关于C中string.h中若干常用函数的实现,下面做个简单整理:

1. 【mystrlen】 ----  求字串长度

size_t 
  mystrlen 
  (
  const 
  char
  * 
  str
  ) 
  {
 
     
  assert 
  (
  str
  );
 
     
  size_t 
  length
  =
  0
  ;
 
     
  while 
  ((
  *
  str
  ++
  )
  !=
  '\0'
  )
 
         
  length
  ++
  ;
 
     
  return 
  length
  ;
 
 
  }
       

2. 【mystrcpy】 ----- 字符串拷贝

char
  * 
  mystrcpy 
  (
  char
  * 
  des
  , 
  const 
  char
  * 
  src
  ) 
  {
 
     
  assert 
  (
  des 
  && 
  src
  );
 
     
  char
  * 
  ptr
  =
  des
  ;
 
     
  while 
  ((
  *
  des
  ++=*
  src
  ++
  )
  !=
  '\0'
  )
 
         
  ;
 
     
  return 
  ptr
  ;
 
 
  }
       

3. 【mystrcat】  ----  字符串连接

char
  * 
  strcat 
  (
  char
  * 
  str1
  ,
  const 
  char
  * 
  str2
  ) 
  {
 
     
  assert 
  (
  str1 
  && 
  str2
  );
 
     
  char
  * 
  ptr
  =
  str1
  ;
 
     
  while 
  (
  *
  ptr
  !=
  '\0'
  )
 
         
  ptr
  ++
  ;
 
     
  while 
  ((
  *
  ptr
  ++=*
  str2
  ++
  )
  !=
  '\0'
  )
 
         
  ;
 
     
  return 
  str1
  ;
 
 
  } 
       

4. 【mystrcmp】----  字符串比较

int 
  mystrcmp 
  (
  const 
  char
  * 
  s1
  , 
  const 
  char
  * 
  s2
  ) 
  {
 
     
  assert 
  (
  s1 
  && 
  s2
  );
 
     
  while 
  (
  *
  s1
  &&*
  s2
  &&
  (
  *
  s1
  ==*
  s2
  ))
 
         
  s1
  ++
  ,
  s2
  ++
  ;
 
     
  return 
  *
  s2
  -*
  s1
  ;
 
 
  }
       

5. 【mystrchr】 -----  查找字符

char
  * 
  mystrchr 
  (
  const 
  char
  * 
  str
  , 
  char 
  c
  ) 
  {
 
     
  assert 
  (
  str
  );
 
     
  char 
  *
  ptr
  =
  (
  char
  *
  )
  str
  ;
 
     
  while 
  (
  *
  ptr
  !=
  '\0'
  &&*
  ptr
  !=
  c
  )
 
         
  ptr
  ++
  ;
 
     
  return 
  *
  ptr
  ==
  c 
  ? 
  ptr 
  : 
  NULL
  ;
 
 
  }
       

6. 【mystrstr】  ----   查找子串

char
  * 
  mystrstr 
  (
  const 
  char
  * 
  str
  , 
  const 
  char
  * 
  substr
  ) 
  {
 
     
  assert 
  (
  str
  &&
  substr
  );
 
     
  size_t 
  len1
  =
  0
  ,
  len2
  =
  0
  ,
  pos
  =
  0
  ;
 
     
  while 
  (
  *
  (
  str
  +
  len1
  )
  !=
  '\0'
  ) 
  len1
  ++
  ;
 
     
  while 
  (
  *
  (
  substr
  +
  len2
  )
  !=
  '\0'
  ) 
  len2
  ++
  ;
 
     
  if 
  (
  len2
  >
  len1
  )  
  return 
  NULL
  ;
 
     
  while 
  (
  pos
  ++<
  len1
  -
  len2
  ) 
  {
 
         
  int 
  ipos
  =
  0
  ;
 
         
  while 
  ((
  ipos
  ++<
  len2
  )
  &&
  (
  *
  (
  str
  +
  pos
  +
  ipos
  )
  ==*
  (
  substr
  +
  ipos
  )))
 
             
  ;
 
         
  if 
  (
  ipos 
  == 
  len2
  )
 
             
  return 
  (
  char
  *
  )(
  str
  +
  pos
  );
 
     
  }
 
     
  return 
  NULL
  ;
 
 
  }
       
c