【面试中的】C语言实现字符串函数

C语言字符串函数实现源码汇总

20080518 星期日 16:54

 #include

 char * ___strtok = NULL;

 char * strcpy(char * dest,const char *src)
 {
          char *tmp = dest;

          while ((*dest++ = *src++) != '\0')
  ;
          return tmp;
 }

 char * strncpy(char * dest,const char *src,size_t count)
 {
          char *tmp = dest;

          while (count-- && (*dest++ = *src++) != '\0')
                  ;

          return tmp;
 }

 char * strcat(char * dest, const char * src)
 {
          char *tmp = dest;

          while (*dest)
                  dest++;
          while ((*dest++ = *src++) != '\0')
                  ;

          return tmp;
 }

 char * strncat(char *dest, const char *src, size_t count)
 {
          char *tmp = dest;

          if (count) {
                  while (*dest)
                          dest++;
                  while ((*dest++ = *src++)) {
                          if (--count == 0)
                                  break;
                  }
          }

          return tmp;
 }

 int strcmp(const char * cs,const char * ct)
 {
          register signed char __res;

          while (1) {
                  if ((__res = *cs - *ct++) != 0 || !*cs++)
                          break;
          }

         return __res;
 }

 int strncmp(const char * cs,const char * ct,size_t count)
 {
          register signed char __res = 0;

          while (count) {
                  if ((__res = *cs - *ct++) != 0 || !*cs++)
                          break;
                  count--;
          }

          return __res;
 }

 char * strchr(const char * s,char c)
 {
          for(; *s != c; ++s)
                  if (*s == '\0')
                          return NULL;
          return (char *) s;
 }

 size_t strlen(const char * s)
 {
          const char *sc;

          for (sc = s; *sc != '\0'; ++sc)
                  ;
          return sc - s;
 }

 size_t strnlen(const char * s, size_t count)
 {
          const char *sc;

          for (sc = s; *sc != '\0' && count--; ++sc)
                  ;
          return sc - s;
 }

 size_t strspn(const char *s, const char *accept)
 {
          const char *p;
          const char *a;
          size_t count = 0;

          for (p = s; *p != '\0'; ++p) {
                  for (a = accept; *a != '\0'; ++a) {
                          if (*p == *a)
                                  break;
                  }
                  if (*a == '\0')
                          return count;
                  ++count;
          }

          return count;
 }

 char * strpbrk(const char * cs,const char * ct)
 {
          const char *sc1,*sc2;

          for( sc1 = cs; *sc1 != '\0'; ++sc1) {
                  for( sc2 = ct; *sc2 != '\0'; ++sc2) {
                          if (*sc1 == *sc2)
                                  return (char *) sc1;
                  }
          }
          return NULL;
 }

 char * strtok(char * s,const char * ct)
 {
          char *sbegin, *send;

          sbegin   = s ? s : ___strtok;
          if (!sbegin) {
                  return NULL;
          }
          sbegin += strspn(sbegin,ct);
          if (*sbegin == '\0') {
                  ___strtok = NULL;
                  return( NULL );
          }
          send = strpbrk( sbegin, ct);
          if (send && *send != '\0')
                  *send++ = '\0';
          ___strtok = send;
          return (sbegin);
 }

 void * memset(void * s,char c,size_t count)
 {
          char *xs = (char *) s;

          while (count--)
                  *xs++ = c;

          return s;
 }

 char * bcopy(const char * src, char * dest, int count)
 {
          char *tmp = dest;

          while (count--)
                  *tmp++ = *src++;

          return dest;
 }

 void * memcpy(void * dest,const void *src,size_t count)
 {
          char *tmp = (char *) dest, *s = (char *) src;

          while (count--)
                  *tmp++ = *s++;

          return dest;
 }

 void * memmove(void * dest,const void *src,size_t count)
 {
          char *tmp, *s;

          if (dest <= src) {
                  tmp = (char *) dest;
                  s = (char *) src;
                  while (count--)
                          *tmp++ = *s++;
                  }
          else {
                  tmp = (char *) dest + count;
                  s = (char *) src + count;
                  while (count--)
                          *--tmp = *--s;
                  }

          return dest;
 }

 int memcmp(const void * cs,const void * ct,size_t count)
 {
          const unsigned char *su1, *su2;
          signed char res = 0;

          for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
                  if ((res = *su1 - *su2) != 0)
                          break;
          return res;
 }


 void * memscan(void * addr, unsigned char c, size_t size)
 {
          unsigned char * p = (unsigned char *) addr;

          while (size) {
                  if (*p == c)
                          return (void *) p;
                  p++;
                  size--;
          }
          return (void *) p;
 }



1. strlen(),计算字符串长度

int strlen (const char *s)
{
const char *p;
for (p = s; *p; ++p);
return p - s;
}


2. strcpy(),  字符串拷贝 .
char *stpcpy (char *dst, const char *src)
{
while ((*dst++ = *src++) != '\0');
return dst - 1;
}


3. strcat(), 字符串的连接.

char *strcat (char *dst, const char *src)
{
char *ret = dst;
while (*dst++ != '\0');
--dst;
while ((*dst++ = *src++) != '\0');
return ret;
}


4. streql(),  判断两个字符串是否相等 .
int streql(char *str1,char *str2)
{
while((*str1==*str2)&&(*str1))
{
str1++;
str2++;
}
return((*str1==NULL)&&(*str2==NULL));
}


5. strchr(), 在字符串中查找某个字符.
char *strchr (const char *s, int c)
{
for (; *s != (char) c; ++s)
if (*s == '\0')
return NULL;
return (char *) s;
}


6. chrcnt(), 计算某个字符在字符串中出现的次数.
int chrcnt(const char *string,int letter)
{
int count=0;
while(*string)
{
if(*string==letter)
count++;
string++;
}
return count;
}


7. strcmp(), 判断两个字符串是否相等.
int strcmp (const char *s1, const char *s2)
{
int ret;
while ((ret = *(unsigned char *) s1 - *(unsigned char *) s2++) == 0
&& *s1++);
return ret;
}

int my_atoi(const char *str){   int result;                //保存返回结果的   int signal = 1;            //保存符号的,默认正数     //判断第一个数字是否合法   
if((*str>='0'&&*str<='9')||*str=='-'||*str=='+'){     //如果是-,符号变为-1,指针右移     //如果是+,指针右移(总之指向了第一个数字)   
if(*str=='-'||*str=='+'){     if(*str=='-')   signal = -1;    str++;   }    }   
else return 0;//第一个不是+,-或数字,非法返回0   //这里就是转换,是数学的问题就不解释了  
 while(*str>='0'&&*str<='9')   result = result*10+(*str++ -'0');   return signal*result;   }
double atof(char s[])        {            double val, power;            int i, sign;               
  for (i = 0; isspace(s[i]); i++)                 ;            sign = (s[i] == '-') ? -1 : 1;           
 if (s[i] == '+' || s[i] == '-')                i++;           
 for (val = 0.0; isdigit(s[i]); i++)                val = 10.0 * val + (s[i] - '0');            
if (s[i] == '.')                i++;           
 for (power = 1.0; isdigit(s[i]); i++) {                val = 10.0 * val + (s[i] -‘0');                 power *= 10;            }          
  return sign * val / power;        }

long __cdecl atol(const char* nptr)
{
         int c;
         int sign;
         long total;
         while(isspace((int)(unsigned char)*nptr))
        {
                 ++nptr;
        }

       c = (int)(unsigned char)*nptr++;
       sign = c;
       if(c == "-" || c == "+")
       {
               c = (int)(unsigned char)*nptr++;
       }
       total = 0;
       while(isdigit(c))
       {
                  total = 10*total + ('c'-0);
                  c = (int)(unsigned char)*nptr++;
       }
       return (sign == '-') ? -total : total;
}
 


充分利用assert()函数来首先进行判断。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值