C++提供了功能强大的字符串检测和处理函数,以下是对它们的实现(实现方式多种多样,仅实现其中一种)。
myString.h
#include "assert.h"
//返回字符串的长度
size_t strlen(const char *s)
{
assert(s != NULL);
size_t count = 0;
while(s[count] != '\0')
{
count++;
}
return count;
}
//将字符串s2覆盖s1 返回s1的首地址
char * strcpy(char *s1,const char *s2)
{
assert(s1 != NULL && s2 != NULL);
char * str = s1;
//拷贝s2的结尾符'\0'进入s1,故s1长度等于s2长度
while((*s1 = *s2) != '\0')
{
s1++;
s2++;
}
return str;
}
//如果n大于s2长度函数功能等同于strcpy();n小于s2长度,s2的前n个字符覆盖s1的前n个字符
char * strncpy(char *s1,const char *s2,size_t n)
{
assert(s1 != NULL && s2 != NULL);
char *str = s1;
//n<=strlen(s2)时:不拷贝s2结尾字符'\0'到s1,故s1长度不变
//n> strlen(s2)时:拷贝s2结尾符'\0'到s1,故s1长度为s2长度
for(int i=0;(i<n)&&(*s1 = *s2)!='\0';i++)
{
s1++;
s2++;
}
return str;
}
//将字符串s2添加到s1的末尾
char * strcat(char *s1,const char *s2)
{
assert(s1 != NULL && s2 != NULL);
char * str = s1;
//让指针s1指向结尾字符'\0'的位置
while(*s1 != '\0')
{
s1++;
}
//将s2的内容依次拷贝到s1的结尾
while((*s1 = *s2)!= '\0')
{
s1++;
s2++;
}
return str;
}
//将字符串s2复制到s1的末尾,最多复制n个字符
char * strncat(char *s1,const char *s2,size_t n)
{
assert(s1 != NULL && s2 != NULL);
char * str = s1;
while(*s1 != '\0')
{
s1++;
}
//如果n<= strlen(s2):复制s2前n个字符到s1末尾
//如果n> strlen(s2):复制s2到s1末尾
for(size_t i = 0;(i<n)&&(*s1 = *s2)!= '\0';i++)
{
s1++;
s2++;
}
*s1 = '\0';
return str;
}
//比较s1,s2的大小:返回结果为正、零、负时分别代表s1>s2,s1==s2,s1<s2
int strcmp(char *s1,const char *s2)
{
assert(s1!=NULL && s2!=NULL);
while(*s1 == *s2 && *s1!='\0')
{
s1++;
s2++;
}
return *s1 - *s2;
}
//比较s1,s2前n个字符的大小:返回结果为正、零、负时分别代表s1>s2,s1==s2,s1<s2
int strncmp(char *s1,const char *s2,size_t n)
{
assert(s1!=NULL && s2!=NULL);
for(size_t i = 0;(i<n-1) && (*s1 == *s2) && (*s1 != '\0');i++)
{
s1++;
s2++;
}
return *s1 - *s2;
}
以下是对myString.h头文件中方法的使用
Main.cpp
#include <iostream>
#include "myString.h"
using namespace std;
int main()
{
char s1[] = "BBBB";
char s2[] = "AA";
int flag = 0;
//strlen()函数使用举例
if(flag == 0)
{
cout<<"s1:"<<strlen(s1)<<" "<<"s2:"<<strlen(s2)<<endl;
}
//strcpy()函数使用举例
else if(flag == 1)
{
strcpy(s1,s2);
cout<<s1<<endl;
}
//strncpy()函数使用举例
else if(flag == 2)
{
strncpy(s1,s2,1);
cout<<s1<<" "<<strlen(s1)<<endl;
}
//strcat()函数使用举例
else if(flag == 3)
{
strcat(s1,s2);
cout<<s1<<" "<<strlen(s1)<<endl;
}
//strncat()函数使用举例
else if(flag == 4)
{
strncat(s1,s2,1);
cout<<s1<<" "<<strlen(s1)<<endl;
}
//strcmp()函数使用举例
else if(flag == 5)
{
cout<<strcmp(s1,s2)<<endl;
}
//strncmp()函数使用举例
else if(flag == 6)
{
cout<<strncmp(s1,s2,2)<<endl;
}
return 0;
}