`
nmv884rp
  • 浏览: 24878 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

字符串处理

 
阅读更多

  第一节、字符串查找
  1.1题目描述:
  给定一个字符串A,要求在A中查找一个子串B。
  如A="ABCDF",要你在A中查找子串B="CD"。
  分析:比较简单,相当于实现strstr库函数,主体代码如下:
  //在字符串中查找指定字符串的第一次出现,不能找到则返回-1      
  int strstr(char *string, char *substring)      
  {     
  if (string == NULL || substring == NULL)        
  return -1;        
  int lenstr = strlen(string);     
  int lensub = strlen(substring);     
  if (lenstr 字符串中查找第一个子串的功能,时间复杂度为O(n*m),也可以用KMP算法,复杂度为O(m+n)。具体的,在此不再赘述。
  希望此狂想曲系列能给各位带来的是一种方法,一种创造力,一种举一反三的能力,而不是机械的只是为大家提供答案。那样的话,一切永远都只是邯郸学步,你我都无从进步(而这同时却是许多所谓的面经或面试宝典之类的书很乐意做的事,有点不解)。
  为人打通思路,提高他人创造力,我想,这是狂想曲与其它的面试解答所不同的地方,也是我们写狂想曲系列文章的意义与价值之所在。
  1.2、题目描述
  在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
  代码则可以如下编写:
  //查找第一个只出现一次的字符,        
  char FirstNotRepeatChar(char* pString)     
  {     
  if(!pString)     
  return'\0';     
  constint tableSize = 256;    
  //有点要提醒各位注意,一般常数的空间消耗,如这里的256,我们也认为此空间复杂度为O(1)。  
  int hashTable[tableSize] = {0}; //存入数组,并初始化为0     
  char* pHashKey = pString;     
  while(*(pHashKey) != '\0')     
  hashTable[*(pHashKey++)]++;     
  while(*pString != '\0')     
  {     
  if(hashTable[*pString] == 1)     
  return *pString;     
  pString++;     
  }     
  return'\0';  //没有找到满足条件的字符,退出      }     代码二,bitmap:
  # include  
  # include  
  constint N = 26;  
  int bit_map[N];  
  void findNoRepeat(char *src)  
  {  
  int pos;  
  char *str = src;  
  int i ,len = strlen(src);  
  //统计  
  for(i = 0 ; i 字符串开始遍历其bit_map==1 那么就是结果  
  for(i = 0 ; i 字符串拷贝
  题目描述:
  要求实现库函数strcpy,
  原型声明:externchar *strcpy(char *dest,char *src); 
  功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 
  说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 
  返回指向dest的指针。
  分析:如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
  //得2分     
  void strcpy( char *strDest, char *strSrc )     
  {     
  while( (*strDest++ = * strSrc++) != '\0' );     
  }      
  //得4分     
  void strcpy( char *strDest, constchar *strSrc )      
  {     
  //将源字符串加const,表明其为输入参数,加2分     
  while( (*strDest++ = * strSrc++) != '\0' );     
  }      
  //得7分      void strcpy(char *strDest, constchar *strSrc)       {          //对源地址和目的地址加非0断言,加3分     
  assert( (strDest != NULL) && (strSrc != NULL) );     
  while( (*strDest++ = * strSrc++) != '\0' );     
  }      
  //得9分     
  //为了实现链式操作,将目的地址返回,加2分!     
  char * strcpy( char *strDest, constchar *strSrc )      
  {     
  assert( (strDest != NULL) && (strSrc != NULL) );     
  char *address = strDest;      
  while( (*strDest++ = * strSrc++) != '\0' );      
  return address;     
  }    
  //得10分,基本上所有的情况,都考虑到了  
  //如果有考虑到源目所指区域有重叠的情况,加1分!     
  char * strcpy( char *strDest, constchar *strSrc )      
  {     
  if(strDest == strSrc) { return strDest; }  
  assert( (strDest != NULL) && (strSrc != NULL) );     
  char *address = strDest;      
  while( (*strDest++ = * strSrc++) != '\0' );      
  return address;     
  }    
  第三节、小部分库函数的实现
  考察此类编写同库函数一样功能的函数经常见于大大小小的IT公司的面试题目中,以下是常见的字符串库函数的实现,希望,对你有所帮助,有任何问题,欢迎不吝指正:
  //@yansha:字串末尾要加结束符'\0',不然输出错位结果  
  char *strncpy(char *strDes, constchar *strSrc, unsigned int count)      
  {      
  assert(strDes != NULL && strSrc != NULL);      
  char *address = strDes;      
  while (count-- && *strSrc != '\0')      
  *strDes++ = *strSrc++;   
  *strDes = '\0';  
  return address;      
  }   
  //查找字符串s中首次出现字符c的位置   
  char *strchr(constchar *str, int c)   
  {   
  assert(str != NULL);   
  for (; *str != (char)c; ++ str)   
  if (*str == '\0')   
  return NULL;   
  return str;   
  }   
  int strcmp(constchar *s, constchar *t)   
  {   
  assert(s != NULL && t != NULL);   
  while (*s && *t && *s == *t)   
  {   
  ++ s;   
  ++ t;   
  }   
  return (*s - *t);   
  }    char *strcat(char *strDes, constchar *strSrc)    {        assert((strDes != NULL) && (strSrc != NULL));        char *address = strDes;        while (*strDes != '\0')            ++ strDes;        while ((*strDes ++ = *strSrc ++) != '\0')            NULL;        return address;    }    int strlen(constchar *str)    {        assert(str != NULL);        int len = 0;        while (*str ++ != '\0')            ++ len;        return len;    }    //此函数,梦修改如下     
  char *strdup_(char *strSrc)     
  //将字符串拷贝到新的位置     
  {     
  if(strSrc!=NULL)     
  {     
  char *start=strSrc;     
  int len=0;     
  while(*strSrc++!='\0')     
  len++;     
  char *address=(char *)malloc(len+1);     
  assert(address != NULL);  
  while((*address++=*start++)!='\0');      
  return address-(len+1);      
  }     
  return NULL;     
  }     
  //多谢laoyi19861011指正  
  char *strstr(constchar *strSrc, constchar *str)   
  {   
  assert(strSrc != NULL && str != NULL);   
  constchar *s = strSrc;   
  constchar *t = str;   
  for (; *strSrc != '\0'; ++ strSrc)   
  {   
  for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)   
  NULL;   
  if (*t == '\0')   
  return (char *) strSrc;   
  }   
  return NULL;   
  }   
  char *strncpy(char *strDes, constchar *strSrc, unsigned int count)      
  {      
  assert(strDes != NULL && strSrc != NULL);      
  char *address = strDes;      
  while (count -- && *strSrc != '\0')      
  *strDes ++ = *strSrc ++;      
  *strDes = '\0';  
  return address;      
  }      
  char *strncat(char *strDes, constchar *strSrc, unsigned int count)   
  {   
  assert((strDes != NULL) && (strSrc != NULL));   
  char *address = strDes;   
  while (*strDes != '\0')   
  ++ strDes;   
  while (count -- && *strSrc != '\0' )   
  *strDes ++ = *strSrc ++;   
  *strDes = '\0';   
  return address;   
  }   
  int strncmp(constchar *s, constchar *t, unsigned int count)   
  {        assert((s != NULL) && (t != NULL));        while (*s && *t && *s == *t && count --)        {            ++ s;            ++ t;        }        return (*s - *t);    }    char *strpbrk(constchar *strSrc, constchar *str)    {        assert((strSrc != NULL) && (str != NULL));        constchar *s;        while (*strSrc != '\0')        {            s = str;            while (*s != '\0')            {                if (*strSrc == *s)                    return (char *) strSrc;                ++ s;            }            ++ strSrc;        }        return NULL;    }    int strcspn(constchar *strSrc, constchar *str)    {        assert((strSrc != NULL) && (str != NULL));        constchar *s;        constchar *t = strSrc;        while (*t != '\0')        {            s = str;            while (*s != '\0')            {                if (*t == *s)                    return t - strSrc;                ++ s;            }            ++ t;        }        return 0;    }    int strspn(constchar *strSrc, constchar *str)    {        assert((strSrc != NULL) && (str != NULL));        constchar *s;        constchar *t = strSrc;        while (*t != '\0')        {            s = str;            while (*s != '\0')            {                if (*t == *s)                    break;                ++ s;            }            if (*s == '\0')                return t - strSrc;            ++ t;        }        return 0;    }    char *strrchr(constchar *str, int c)    {        assert(str != NULL);        constchar *s = str;        while (*s != '\0')            ++ s;        for (-- s; *s != (char) c; -- s)            if (s == str)                return NULL;            return (char *) s;    }    char* strrev(char *str)    {        assert(str != NULL);        char *s = str, *t = str, c;        while (*t != '\0')            ++ t;        for (-- t; s = 'a' && *s = 'A' && *s  psrc && pdest - psrc  0 )           ret = 1 ;       return( ret );   }   size_t __cdecl strlen (constchar * str)   {       constchar *eos = str;       while( *eos++ ) ;       return( (int)(eos - str - 1) );   }   char * __cdecl strncat (char * front,constchar * back,size_t count)   {       char *start = front;       while (*front++)           ;       front--;       while (count--)           if (!(*front++ = *back++))               return(start);           *front = '\0';           return(start);   }   int __cdecl strncmp (constchar * first,constchar * last,size_t count)   {       if (!count)           return(0);       while (--count && *first && *first == *last)       {           first++;           last++;       }       return( *(unsigned char *)first - *(unsigned char *)last );   }   /* Copy SRC to DEST.  */   char *   strcpy (dest, src)   char *dest;   constchar *src;   {       reg_char c;       char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);       const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;       size_t n;       do       {           c = *s++;           s[off] = c;       }       while (c != '\0');       n = s - src;       (void) CHECK_BOUNDS_HIGH (src + n);       (void) CHECK_BOUNDS_HIGH (dest + n);       return dest;   }   char * __cdecl strncpy (char * dest,constchar * source,size_t count)   {       char *start = dest;       while (count && (*dest++ = *source++))    /* copy string */           count--;       if (count)                              /* pad out with zeroes */           while (--count)               *dest++ = '\0';            return(start);   }  
分享到:
评论

相关推荐

    被爱可被爱以字符串处理工具 1.7.1

    被爱可以字符串处理工具由中国被爱可以在线站长Bicyle开发,是一款字符串处理的绿色工具软件,它具有繁简体转换 、URL和HTML编码转换、字母大小写转换、邮件地址分组、半全角转换、区位码和ASCII码查询,WAP文档UTF-...

    纯C++ 字符串处理函数大全源码

    自己封装的纯C++的字符串处理函数大全,像特别好用的 字符串切分 Split函数代码均已经过测试,并有接口说明,可方便调用。

    字符串处理通用程序汇编语言

    字符串处理通用程序 功能说明: ①:查找 ②:删除 ③:替换 ④:插入 寄存器说明: SI:①:主串下标 ②:替换串下标 DX:保存主串下标SI AL:保存主串字符 BX:子串下标 AH:保存子串字符 DI:存储下标 标记...

    [免注册]被爱可以字符串处理工具 V1.7

    被爱可以字符串处理工具由中国被爱可以在线站长Bicyle开发,是一款字符串处理的绿色工具软件,它具有繁简体转换 、URL和HTML编码转换、字母大小写转换、邮件地址分组、半全角转换、区位码和ASCII码查询,WAP文档UTF...

    java 字符串处理

    java 常用字符串处理工具类! java 常用字符串处理工具类!

    汇编字符串处理

    汇编字符串处理

    C语言学习-字符串处理函数

    C语言学习-字符串处理函数 strcat(char str1,char str2) strcpy(char str1,char str2) strncpy(char str1,char str2,int n) strcmp(char str1,char str2)//比较两个字符串大小str1>str2返回值>0,str1=str2...

    字符串处理函数及示例

    字符串处理函数及示例 如: 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *strcpy(char *destin, char *source); 程序例: C/C++ code #include #include int main(void) { char string[10]; char ...

    字符串处理必做题解析

    acm习题,字符串处理 ,必做题解析,题目经典,含有解析

    字符串处理系统.cpp

    多重字符处理机制,仿照python字符串处理写的一个针对c++的字符串处理

    mysql常用字符串函数、字符串处理函数大全

    mysql常用字符串函数、字符串处理函数大全。word文档内容中涵盖了mysql数据库字符串处理的38个函数。可完全满足日常对mysql数据库的字符处理操作。

    指针编写字符串处理函数

    本文档中包含了基础的字符串处理函数strlen(),strcat(),strlwr(),struupr(),等等一些基础的函数,非常有利于初学编程的人进行学习,对字符串进行更深入的了解!同时,内部应用的指针的典型用法,巩固对指针的理解!...

    C语言字符串处理函数

    几个字符串处理函数增强版 常用需求基本都能完成 已经编译成DLL 函数列表 兼容字符和串 void revstr char str 字符串反转 int substring char res int pos int len char substr 从pos开始取len个字符到substr中 ...

    JAVA字符串处理函数列表一览

    JAVA字符串处理函数列表一览 JAVA字符串相关

    Python内置的字符串处理函数

    Python内置的字符串处理函Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。

    被爱可以字符串处理工具注册机

    被爱可以字符串处理工具及 被爱可以字符串处理工具注册机

    C++字符串处理类库及范例

    该资源是一个鲁棒性好,经过优化的C++字符串处理算法,包括分割字符串,自定义分隔符,字符串匹配,字符串搜索,不需要编译和安装。

    VB字符串处理函数大全

    VB字符串处理函数大全:mid(字符串,从第几个开始,长度) ByRef 在[字符串]中[从第几个开始]取出[长度个字符串]

    字符串处理系统课程设计.doc

    字符串处理系统课程设计

    java字符串处理输入一个字符串和一个字符后,原字符串中所有该字符将被删除并显示出结果

    编写一个applet程序,在窗口界面中实现当输入一个字符串和一个字符后,原字符串中所有该字符将被删除并显示出结果

Global site tag (gtag.js) - Google Analytics