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

《现场手写Coding》

2017年12月20日 ⁄ 综合 ⁄ 共 4841字 ⁄ 字号 评论关闭

现场编写strstr,strcpy,strpbrk的函数

库函数,细节的把握,编程能力扎实过硬

 

==============================================================================

==============================================================================

字符串查找strstr()

int strstr ( char * string, char * substring)

 

==============================================================================

==============================================================================

查找第一个只出现1次的字符

char FirstNotRepeatChar(char* pString)

{

 if(!pString) return '\0';

 const int tableSize = 256;

 int hashTable[tableSize] = {0};

 char* pHashKey = pString;

 

 while(*(pHashKey)! = '\0')

  hashTable[*(pHashKey++)]++;

 

 while(*pString != '\0')

 {

  if(hashTable[*pString] == 1)

   return *pString;

  pString++;

 }

 return '\0';

}

 

ASCII码表:

1 - 49

0 - 48

A - 65

a - 97

 

==============================================================================

==============================================================================

方法二:

#include<stdio.h>

#include<string.h>

 

const int N = 26;

int bit_map[N];

 

void findNoRepeat(char* src)

{

 int pos;

 chat* str = src;

 int i,len = strlen(src);

 for(i=0;i<len;i++)

  bit_map[str[i]-'a']++;

 for(i=0;i<len;i++)

 {

  if(bit_map[str[i]-'a' == 1)

  {

   printf("%c",str[i]);

   return;

  }

 }

}

==============================================================================

==============================================================================

char* strncpy(char*strDes,const char* strSrc, unsigned int count)

{

 assert(strDes != NULL && strSrc!= NULL);

 char* address = strDes;

 while(count-- && *strSrc !='\0')

  *strDes++ = *strSrc++;

 *strDest = '\0';

 return address;

}

 

==============================================================================

==============================================================================

查找字符串中首次出现字符C的位置

char* strchr(const char* str,int c)

{

 assert(str != NULL);

 while(*s != '\0' && *s != c)

  ==S;

 return (*s == c) ? s:NULL;

}

 

==============================================================================

==============================================================================

int strcmp(constchar* s,const char* t)

{

 assert(s!=NULL && t!=NULL);

 while(*s && *t &&*s==*t)

 {

  ++s;

  ++t;

 }

 return (*s - *t);

}

==============================================================================

==============================================================================

 

char* strcat(char* strDes,const char* strSrc)

P184/401

==============================================================================

==============================================================================

C中的qsort()函数

#include<stdlib.h>

void qsort(void* base,int nelem,intwidth,int(*fcmp)(const void*,const void*));

 

int cmp(const void* a,const void* b)

{

 return *(int*)a - *(int*)b;

}

 

int cmp(const void* a,const void* b)

{

 return ((*(double*)a-*(double*)b)>0?1:-1);

}

 

==============================================================================

==============================================================================

strcpy()手写代码

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

{

 char* strDestCopy =strDest;

 if((strDest == NULL) || (strSrc ==Null))

  throw "Invalid argument(s)";

 while((*strDest++ = *strSrc++) != '\0')

 return strDestCopy;

}

 

 

==============================================================================

==============================================================================

 

反转字符串

 

 

 

void reverse ( char* str )

{

assert(str != NULL);     //#include<assert.h>

char* head = str;

while ( *str++ ) { };

str--;

char* tail = str--;

while(head<tail)

{

*head ^= *tail;

*tail-- ^= *head;

*head++ ^= *tail;

}

}

 

反转字符串(不申请变量和空间)                        有道云笔记

 

 

atoi()函数:字符串转换成整型数 ASCII to Integer        有道云笔记

#include<cctype>

int my_atoi (const char* str)

{

assert(str!=NULL);

bool neg_flag = false;

int result = 0;

if(str[0]==’+’ || str[0]==’-’)

reg_flag = (*str++ != ‘+’);

while(isdigit(*str))

result = result * 10 + (*str++ - ‘0’);

return neg_flag ? 0-result : result;

}

 

strlen()函数:不用任何中间变量实现

利用常量OR编译器在递归中栈中申请。(分析过程)

int strlen( const char* )

{

if(str == NULL) return 0;

If(*str !=’\0’)

return 1+strlen(++str);

else return 0;

}

普通:

size_t strlen( const char * str)

{

Assert(str != NULL);

size_t len = 0;

while (*str++ != ‘\0’)

len++;

Return len;

}

 

strcpy()函数

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

{

if(strDest == NULL || strsrc == NULL)

Return NULL;

if (strDest == strSrc)     //如果是同一个字符串,便不复制

Return strDest;

char* tempptr = strDest;

while(  (*strDest++ = *strSrc) !=’\0’)       ;      //先赋值复制,后判断

return tempptr;

}

 

strstr()函数:是否有子字符串 finds the first occurrence of string2 in string1

char * strstr (const char * str1,const char * str2)

{

        char *cp =(char *) str1;

        char *s1, *s2;

        if ( !*str2 )

           return((char *)str1);

        while (*cp)

        {

               s1 = cp;

               s2 = (char *) str2;

 

               while ( *s1 && *s2 && !(*s1-*s2) )

                       s1++, s2++;

 

               if (!*s2)

                       return(cp);

 

               cp++;

        }

        return(NULL);

}

 

char *mystrstr(char *s1 , char *s2)

{

  if(*s1==0)

  {

    if(*s2) return(char*)NULL;

    return (char*)s1;

  }

  while(*s1)

  {

    int i=0;

    while(1)

    {

      if(s2[i]==0) return s1;

      if(s2[i]!=s1[i]) break;

      i++;

    }

    s1++;

  }

  return (char*)NULL;

}

 

抱歉!评论已关闭.