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

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;
else
t++;
}
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);
 
 
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值