1.strlen函数
功能讲解:
size_t strlen ( const char * str );//参数不能是NULL
//const 是防止*str被改变
char arr[]="abcd"
char arr1[]={'a','b','c','d'};
strlen(arr);
strlen(arr1);
strlen是求字符串长度的函数,给定一个字符串,以'\0'结尾,该函数数到\0才会停下,所以上面的strlen求得arr长度为4,arr1长度未知,因为'\0'位置不知道。
注意函数的返回值是无符号数(易错)。
函数模拟实现:
方法1.计数器法
int count=0;
char arr[]="abcdef";
char*p=arr;
while(*p)
{
count++; //count的值就是字符串长度
p++;
}
方法2.递归//这里只写递归部分
int my_strlen(const char *string) //设置成int也可以,毕竟长度没有负数
{
if(*string=='\0')
return 0;
else
return 1+my_strlen(string+1);
}
方法3.指针-指针 //库函数的实现方法
const char*str=p;
while(++p)
{
;
}return (p-str-1);
2.strcpy函数
功能讲解:
char * strcpy ( char * destination, const char * source );
//把源拷贝到目的地,两个指针分别是两端字符串的地址,const确保源不会被改变
既然是拷贝,就要确定拷贝多少,strcpy是以'\0'为拷贝结束标志的,且会把’\0‘拷贝到目的字符串。为确保拷贝成功,需要保证目的地空间足够且可以改变。
模拟实现:
void my_strcpy(char*p1, const char*p2)
{
assert(src!=NULL); //断言,检查是否为NULL;
while (*p1++ = *p2++) //赋值表达式,值为赋值结果,当把'\0'赋值过来,循环结束
{
;
}
}
3.strcat函数
char * strcat ( char * destination, const char * source );
char arr1[100] ="opcs";
char arr2[] = "abcde";
strcat(arr1, arr2);
功能讲解:
区分于strcpy,此函数是在目的字符串后面追加字符串,需要保证目的地空间足够。strcat首先会寻找目标字符串的'\0',然后把源数据追加过去,包括'\0',返回目标空间的地址。
注意该函数无法自己追加到自己后面,因为自己的'\0'会被覆盖,造成死循环,strncat才可以。
功能实现
char* my_strcat(char*dest,const char *src)
{
char *ret=dest;
assert(dest&&src);
while(dest)
{ dest++; } //寻找'\0'
while(*dest++=*src++);//追加数据
return ret; //该函数的返回值也可以是void,视main()那边的情况而定
}
4.strcmp函数
功能讲解:
int strcmp ( const char * str1, const char * str2 );
//字符串相等 返回0
//第一个字符串小返回 负数
//第一个字符串大返回 正数
字符串的比较是对应位置的字符的比较,
模拟实现:
int my_strlen(const char* p1, const char* p2)
{
assert(p1 && p2);
while (*p1 == *p2)
{
if (*p1 == '\0')
{
return 0;
}
p1++;
p2++;
}
return *p1 - *p2; //返回正或者负值即可
}
5.strncpy函数(长度受限制的字符函数)
char * strncpy ( char * destination, const char * source, size_t num );
功能讲解:和strcp相比,strncpy可以限制拷贝字符数,但拷贝的字符数不要超过目标空间的大小,否则会造成越界,和strcpy类似。
功能实现:
void my_strcpy(char*p1, const char*p2,int count)
{
assert(src!=NULL); //断言,检查是否为NULL;
while (count--)
{
*p1=*p2;
p1++;
p2++;
}
}
6.strncat
char * strncat ( char * destination, const char * source, size_t num );
功能讲解:此函数是在目的字符串后面追加n个字符串,需要保证目的地空间足够。strncat首先会寻找目标字符串的'\0',然后把源数据追加过去,并且加上'\0',返回目标空间的地址。如果n太大,源字符串不足,则将源字符串全部追加过去。注意strncat可以在自己后面追加字符串,这一点和strcat不一样。
char* my_strcat(char*dest,const char *src,int count)
{
char *ret=dest;
assert(dest&&src);
while(dest)
{ dest++; } //寻找'\0'
while(count--)//追加数据
{
if((*dest++=*src++)==0)
return (ret);
}
*dest='\0';
return ret; //该函数的返回值也可以是void,视main()那边的情况而定
}
7.strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
该函数功能和strcmp差不多,只不过多了一个n限制比较的字符长度,比较简单,就不多说。
8.strstr
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
功能讲解:在str1字符串里查找是否存在str2字符串,找到后会返回第一次出现的位置,没找到会返回一个NULL。比如:在abcde里面找bc,会返回b的地址。
功能实现:
char* my_strstr(const char*str1,const char*str2)
{
char*s1=str1;
char*s2=str2;
const char*cp=str1;
if(*str2=='\0')
return (char*) str1; //str2是空指针
while(*cp)
{
s1=cp; //可能会多次匹配,比如bbc,abbbcd 这种情况
s2=str2;
while(*s1==*s2&&*s1&&*s2)
{
s1++;
s2++;
}
if(*s2='\0")
{return cp;}
cp++;
}
retur NULL;
也可以用KMP算法 有一定难度,效率比较高
9.strtok
char * strtok ( char * str, const char * delimiters );
//delimiters是字符串,定义了用作分割符的集合
功能讲解:按照标点符号切割字符串,第一个参数指定一个字符串,它包含了0个或者多个由del字符串中的一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针。(注:该函数会改变被操作额字符串,所以在使用strtok函数切割的字符串一般都是临时拷贝的内容并且可以修改。)
strtok的第一个参数如果不为NULL,函数将找到str中的第一个标记,并记录它在字符串中的位置,
strtok函数的第一个参数如果为NULL。函数将在同一个字符串中被保存的位置开始,查找下一个标记,如果找不到更多的标记,则返回NULL指针。
使用方法:
int main () {
char str[80] = "This is - www.runoob.com - website";
const char s[2] = "-";
char *token;
strcpy(token,str) //拷贝字符串,避免被修改
char *temp=NULL;
for(temp=strtok(token,s);temp!=NULL;temp=strtok(NULL,s))
{
printf("%s\n",temp);
}
return(0);
}
10.strerror
char * strerror ( int errnum );
//必须包含的头文件:<error.h>
功能讲解:使用库函数失败的时候,返回错误码
使用方法:
FILE*p=fopen("test.txt","r") //打开一个不存在的文件
if(P==NULL)
{
printf("%s\n"strerror(p,errno); errno 全局变量,需要包含头文件error.h
return 1;
}