常见库函数
1.strcpy字符串复制函数
头文件:
#include<string.h>
函数原型
char * strcpy(char * strDest,const char * strSrc);
该函数功能是将后面字符串的内容复制给前面的字符串。源字符串 即后面的字符串保持不变,前面的字符串被改变。
使用需注意:
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
看下面的代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[]="hello";
char str2[]="hello world";
strcpy(str1,str2);
printf("%s\n",str1);
printf("%s\n",str2);
return 0;
}
结果:
2.strlen 计算字符串长度函数
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。
注意:这里应注意用strlen 和sizeof计算字符串的长度或大小时的不同,strlen计算字符串长度是不包含‘\0’,而sizeof包含。
函数原型
*unsigned int strlen(char s);
例:
int main()
{
char str1[]="hello";
int n=strlen(str1);
int m=sizeof(str1);
printf("strlen:%d\n",n);
printf("sizeof:%d\n",m);
return 0;
}
3.strcmp字符串比较函数
C 库函数 **int strcmp(const char str1, const char str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
**返回值:**若前字符串大于后面则返回一个正数,若小于则返回负数,若相等则返回0;
比较的方法:
将两个字符串从下标0开始比较,用相同下标的字符的ASCII进行逐个比较,知道比出大小不同的字符,当前字符那个大,那么那个字符串就大。
例:
4.strstr子串查找函数
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
函数原型:string strstr( string1,string2)
举例:
#include<string.h>
#include<stdio.h>
main()
{
char *string 1 = “needle in haystack";
char *string2 = “hay"
printf(“%s\n.”strstr(stringl,string2);
}
输出:
haystac
5.strcat字符串连接函数
**char *strcat(char *dest, const char *src) **
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
返回值:该函数返回一个指向最终的目标字符串 dest 的指针。
#include<stdio.h>
#include<string.h>
int main()
{
char desc[50]="abc";
char src[50]="def";
strcat(desc,src);
printf("%s",desc);
return 0;
}
结果:
模拟实现
1.strcpy的模拟实现
char* my_strcpy(char* desc,const char* src)
{
char* ret=desc; //保存目的字符串的地址
assert(desc!=NULL); //目的字符串不能为空
assert(src!=NULL); //源字符串不能为空
while(*desc++ = *src++)
{
;
}
return ret;
}
2.strlen的模拟实现
三种方式::
方法1:
计数器方式
unsigned int my_strlen(const char* desc)
{
assert(desc!=NULL);
int i=0;
while(*desc)
{
i++;
desc++;
}
return i;
}
方法2:
不创建临时变量
unsigned int my_strlen(const char* desc)
{
assert(desc!=NULL);
if(*desc=='\0')
return 0;
else
return 1+my_strlen(desc+1);
}
方法3:
指针-指针的方式
unsigned int my_strlen(const char* desc)
{
assert(desc!=NULL);
char* p=desc;
while(*p!='\0')
p++;
return p-desc;
}
3.strcmp模拟实现
//减法运算判断
int my_strcmp(const char* str1,const char* str2)
{
int ret=0;
while(! (ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str2)
{
++str1;
++str2;
}
if(ret<0)
return -1;
else if(ret>0)
return 1;
else
return ret;
}
//比较判断运算
//比较运算判断
int MyStrcmp2(const char* dest, const char* src)
{
assert(NULL != dest && NULL != src);
while ((*dest) && (*src == *dest))
{
*dest++;
*src++;
}
if (*(unsigned char*)dest > *(unsigned char*)src)
return 1;
else if (*(unsigned char*)dest < *(unsigned char*)src)
return -1;
else
return 0;
}
**4.strstr**模拟实现
char* my_strstr(const char* str1,const char* str2 )
{
assert(str1!=NULL);
assert(sre2!=NULL);
char* cp=(char*) str1;
char* s1=NULL;
if(str2=='\0')
return NULL;
while(*cp)
{
char* substr=(char*) str2;
if(*cp==*substr)
{
s1=cp;
while(*s1&&*substr&&(*s1==*substr))
{
s1++;
substr++;
}
if(*substr=='\0')
return cp;
}
cp++;
}
}
**5.strcat**模拟实现
char* my_strcat(char* desc,const char* src)
{
assert(desc);
assert(src);
char* ret=desc;
while(*desc)
{
desc++;
}
while((*desc++=*src++))
{
;
}
return ret;
}