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);