《C和指针》第九章 字符串、字符和字节

来源:互联网 发布:视频格式转换软件下载 编辑:程序博客网 时间:2024/06/04 04:26

1.头文件string.h包含了使用字符串函数所需的原型和声明,字符串都是以‘\0’结尾

2.字符串长度  strlen函数  原型:size_t strlen(char const  *str) (做到自己可以编写出来实现)

int strlen (char const *str){int len=0;assert(str!=NULL);while(*str++!='\0')len++;return len;}

3.不受限制的字符串函数:(结束都是靠'\0'控制,程序员必须保证目标字符数组的空间足够容纳)

 复制字符串strcpy   原型:char    *strcpy  (char     *des,   char   const   *src);实现把参数src的字符串复制到des参数,返回第一个参数的一份拷贝(做到自己可以编写出来)

char *strcpy (char *des,char const *src){assert((des!=NULL)&&(src!=NULL));if(des==src)return des;char *add=des;while((*des++=*src++)!='\0');return add;}

 连接字符串 strcat  原型:char    *strcat (char   *des,  char  const   *src);实现把src字符串的一份拷贝添加在des包含的字符串的末端,返回值同上(做到可以自己编写出来)

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


 字符串比较  strcmp  原型:int  strcmp (char const  *s1,char  const  *s2);如果s1小于s2,返回一个小于0的值。大于s2,返回一个大于0的值,等于s2,返回0(自己可以编写)

int strcmp(char const *s1,char const *s2){assert(s1!=NULL&&s2!=NULL);while((*s1==*s2)&&*s1!='\0'&&*s2!='\0'){s1++;s2++;}return (*s1-*s2);}
4.长度受限的字符串:(结束是依靠第三个参数)

 char   *strncpy (char   *des,  char  const  *src,  size_t  len);

char *strncpy(char *des,char const *src, int count){assert((sed!=NULL)&&(src!=NULL));char *add=des;while((count--)&&*src!='\0')*des++=*src++;*des='\0';return add;}

char   *strncat  (char   *des,  char  const  *src,  size_t  len);

<pre name="code" class="cpp">char *strncat(char *des,char const *src, int count){assert(des!=NULL&&src!=NULL);char *add=des;while(*des!='\0')des++;while(count--&&(*src)!='\0'){src++;des++;}*des='\0';return add;}

 int      strncmp  (char  const   *s1,  char  const  *s2,  size_t  len);

int strncmp(char const*s1,char const *s2,int count){assert(s1!=NULL&&s2!=NULL);while(count--&&(*s1==*s2)&&*s1&&*s2){s1++;s2++;}return (*s1-*s2);}


5.字符串查找基础

查找一个字符 char  *strchr (char const  *str,int   ch);作用:查找字符在字符串中第一次出现的位置,并返回该位置

char *strchr(char const *str,int ch){aseert(str!=NUll);for(;*str!=(char)ch;++str)if(*str=='\0')return NULL;return str;}


查找一个字符   char  *strrchr(char  const  *str, int  ch);作用:查找字符在字符串中最后一次出现的位置,并返回该位置

char *strrchr(char const *str, int ch){assert(str!=NULL);char *s=str;while(*s!='\0')++s;for(--s;*s!=(char)ch;--s)if(s==str)   return NULL;return s;}


查找任何几个字符  char *strpbrk(char const *str,char const  *group);作用:查找group中任何一个字符在str中出现的位置。也就是这个函数返回一个指向str中第一个匹配group中任意一个字符的字符位置

char *strpbrk(char const *str,char const *group){assert((str!=NULL)&&(group!=NULL));while(*str!='\0'){char *s=group;while(*s!='\0'){if(*s==*str)return str;s++;}str++;}return NULL;}

查找一个子串 char  *strstr(char  const   *s1,char  const  *s2);作用:查找s1中第一次完整出现s2的起始位置,并返回该位置,如果没有完整的s2,返回一个NULL,s2是空字符串就返回s1;

char *strstr(char const *s1,char const *s2){assert((s1!=NULL)&&(s2!=NULL));while(*s1!='\0'){char *p1=s1;char *s=s2;for(;(*s==*p1)&&*s!='\0';s++,p1++);if(*s=='\0')return s1;}return NULL;}


6.高级字符串查找

查找一个字符串的前缀

size_t  strspn(char const *str,char  const  *group)  作用:用于返回str起始部分匹配group中任意字符的字符数

int strspn(char const *str,char const *group){assert((str!=NULL)&&(group!=NULL));char *s=str;char *t=group;while(*s!='\0'){t=group;while(*t!='\0'){if(*s==*t)break;elset++;}if(*t=='\0')return (s-str);s++;}return 0;}


size_t  strcspn(char  const *str,char  const  *group) 作用:用于返回str起始部分中不与group中任意字符匹配的字符个数

int strcspn(char const *str,char const *group){assert((str!=NULL)&&(group!=NULL));char *s=str;char *t;while(*s!='\0'){t=group;while(*t!='\0'){if(*t==*s)return (s-str);t++;}s++;}return 0;}


查找标记 char  *strtok(char  *str, char  const  *sep)(木有看明白)

7.字符操作

字符转换  int tolower(int  ch)(将大写字母转换成小写字母)和 int  toupper(int   ch);(将小写字母转换成大写字母)

8.内存操作:由于前面所讲到的带str或者strn开头的函数遇到‘\0’就会停止操作,为了防止这种情况采用另外一组相关函数,第三个参数是要指定复制值的长度(以字节为单位)

void *memcpy(void *des,void const *src,size_t length);void *memmove(void *des,void const *src,size_t length);void *memcmp(void const *des,void const *src,size_t length);void *memchr(void const *des,int ch,size_t length);void *memcset(void *des,int ch,size_t length);




0 0