头文件:mystring.h
#ifndef __MYSTRING_H__
#define __MYSTRING_H__
#include<stdio.h>
int myStrlen(const char *a);
char *myStrcpy(char *a,const char *b);
char *myStrncpy(char *a,const char *b,int n);
char *myStrcat(char *a,const char *b);
char *myStrncat(char *a,const char *b,int n);
int myStrcmp(const char *a,const char *b);
int myStrncmp(const char *a,const char *b,int n);
#endif
string.cpp:(改良前)
int myStrlen(const char *a)
{
int n = 0;
while(*a != '\0')
{
n++;
a++;
}
return n;
}
char *myStrcpy(char *a,const char *b)
{
char *ret = a;//函数的返回值是数组a的首地址,下面的操作使得a不再是数组的首地址,所以首先将首地址先保存下来
while(*b != '\0')
{
*a = *b;
a++;
b++;
}
*a = '\0'; //while循环未将b的“\0”拷贝进去
return ret;
}
char *myStrncpy(char *a,const char *b,int n)
{
char *ret = a;
while(*b != '\0' && n != 0)
{
*a = *b;
a++;
b++;
n--;
}
return ret;
}
char *myStrcat(char *a,const char *b)
{
char *ret = a;
while(*a != '\0')//从数组的末尾处连接(即\0处),所以首先将a指向数组的末尾\0处
{
a++;
}
while(*b != '\0')
{
*a = *b;
a++;
b++;
}
*a = '\0';
return ret;
}
char *myStrncat(char *a,const char *b,int n)
{
char *ret = a;
while(*a != '\0')//从数组的末尾处连接(即\0处),所以首先将a指向数组的末尾\0处
{
a++;
}
while(*b != '\0' && n != 0)
{
*a = *b;
a++;
b++;
n--;
}
*a = '\0';
return ret;
}
int myStrcmp(const char *a,const char *b)
{
while((*a != '\0') && (*b != '\0') && (*a == *b))
{
a++;
b++;
}
if(*a == '\0' || *b == '\0')
{
return 0;
}
else if(*a > *b)
{
return 1;
}
else
{
return -1;
}
}
int myStrncmp(const char *a,const char *b,int n)
{
while((*a != '\0') && (*b != '\0') && (*a == *b) && (n-1 != 0))
{
a++;
b++;
n--;
}
if(*a == '\0' || *b == '\0' || *a == *b )
{
return 0;
}
else if(*a > *b)
{
return 1;
}
else
{
return -1;
}
}
改良后:
#include"mystring.h"
int myStrlen(const char *a)
{
int n = 0;
while(*a++ != '\0')
{
n++;
}
return n;
}
char *myStrcpy(char *a,const char *b)
{
/*
函数的返回值是数组a的首地址,
下面的操作使得a不再是数组的首地址,所以首先将首地址先保存下来
*/
char *ret = a;
while((*a++) = (*b++))
{
;
}
return ret;
}
char *myStrncpy(char *a,const char *b,int n)
{
char *ret = a;
/*
注意&&两边的摆放顺序,若改为 (*a++ = *b++)&&(n-- != 0),将多拷贝一次,
因为是先拷贝后判断,及时判断不成立,拷贝已经完成,为时已晚
*/
while((n-- != 0) && (*a++ = *b++))
{
;
}
return ret;
}
char *myStrcat(char *a,const char *b)
{
char *ret = a;
/*
此句不可以改为(*a++ != '\0'),
想想我们的目的是(是指针指到a数组的‘\0’处)
,若改为此句,当*a='\0'时,while循环结束,但后置++仍会执行
此时*a指到了'\0'的后一个存储空间,所以将数组b连接到'\0'的后面
由于'\0'在数组b之前,打印时不会打印处b的内容,依然是数组a
*/
while(*a != '\0')
{
a++;
}
while(*a++ = *b++)
{
;
}
/*
当*b = '\0'时,'\0'赋给a,while('\0')====while(0),所以退出循环,
注意此时数组b中的‘\0’已经复制过去了,所以while循环之后不用再
给数组a的最后赋值‘\0’;
*/
return ret;
}
char *myStrncat(char *a,const char *b,int n)
{
char *ret = a;
while(*a != 0)
{
a++;
}
while((n-- != 0) && (*a++ = *b++))
{
;
}
/*
(*a++ = *b++) && (n-- != 0)注意加上括号,
因为 && 优先级大于 =
*/
return ret;
}
int myStrcmp(const char *a,const char *b)
{
while(*a != '\0' && *b != '\0' && *a == *b)
{
a++;
b++;
}
if(*a == *b)
{
return 0;
}
else if(*a >*b)
{
return 1;
}
else
{
return -1;
}
}
int myStrncmp(const char *a,const char *b,int n)
{
while(--n != 0 && *a != '\0' && *b != '\0' && *a == *b)
{
a++;
b++;
}
if(*a == *b)
{
return 0;
}
else if(*a >*b)
{
return 1;
}
else
{
return -1;
}
}
主函数:main.cpp
#include"mystring.h"
int main()
{
char a[20] = "abc";
char b[] = "acc";
printf("%d\n",myStrcmp(a,b));
printf("%d\n",myStrncmp(a,b,1));
printf("%d\n",myStrlen(a));
printf("%s\n",myStrcat(a,b));
printf("%s\n",myStrncat(a,b,2));
printf("%s\n",myStrcpy(a,b));
printf("%s\n",myStrncpy(a,b,4));
return 0;
}