其中assert函数在以下头文件中
#include <assert.h>
原型:char* strcpy(char* dest, const char *src);
说明:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
char* MyStrcpy(char* dest,const char* src)
{
char* r=dest;
assert(dest!=NULL&&src!=NULL);
while((*dest++=*src++)!='\0');
return r;
}
原型:char* strncpy(char* dest, const char* src,size_t num);
说明:如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
char* MyStrncpy(char* dest, const char* src,size_t num)
{
char* r = dest;
assert(dest!=NULL&&src!=NULL);
while(num&&*src!='\0')
{
*dest++=*src++;
num--;
}
while(num--)
{
*dest++='\0';
}
return r;
}
原型:int strcmp(const char* str1,const char* str2);
说明:比较两个字符串str1和str2
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
当str1<str2时,返回为负数
当str1=str2时,返回值=0
当str1>str2时,返回正数
一般来说,返回值会是:-1 0 1
有些会把两个字符的ASCII码之差作为比较结果由函数值返回。
int MyStrcmp(const char* str1,const char* str2)
{
assert(str1!=NULL&&str2!=NULL);
for(;*str1==*str2;str1++,str2++)
{
if('\0'==*str2)
return 0;
}
//注意要转化为无符号,当ASCII超过127(1个signed char最大表示数值127))时,
//字符会以补码形式存在,有可能得不到正确的结果
return (*(unsigned char*)str1<*(unsigned char*)str2?-1:1);
}
原型:int strncmp(const char* str1,const char* str2,size_t num);
说明:此函数功能即比较字符串str1和str2的前num个字符。
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),
直到出现不同的字符或字节个数达到num个或遇'\0'为止。
当str1[i]<str2[i]时,返回为负数
当str1[i]=str2[i]时,返回值=0
当str1[i]>str2[i]时,返回正数
一般来说,返回值会是:-1 0 +1
有些会把两个字符的ASCII码之差作为比较结果由函数值返回。
int MyStrncmp(const char* str1,const char* str2,size_t num)
{
if(!num)
return 0;
assert(str1!=NULL&&str2!=NULL);
for(num--;num&&*str1==*str2;str1++,str2++,num--)
{
if('\0'==*str2)
return 0;
}
/*替换for循环亦可
while(--num&&*str1==*str2&&*str2!='\0')
{
str1++;
str2++;
}
*/
if(*str1==*str2)
return 0;
else
return *(unsigned char*)str1<*(unsigned char*)str2?-1:1;
}
原型:char* strcat(char* dest,const char* src);
说明:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
char* MyStrcat(char* dest,const char* src)
{
char* r= dest;
assert(dest!=NULL&&src!=NULL);
while(*dest!='\0')
{
dest++;
}
while((*dest++=*src++)!='\0');
return r;
}
原型:size_t strlen(const char* str);
说明:计算字符串str的(unsigned int型)长度,不包括结束符NULL。
以下为不显示申请内存(不用局部变量或者动态申请内存)实现strlen
size_t MyStrlen(const char* str)
{
assert(str!=NULL);
if(*str=='\0')
return 0;
return MyStrlen(str+1)+1;
}
原型:size_t strlen(const char* str);
说明:计算字符串str的(unsigned int型)长度,不包括结束符NULL,该长度最大为maxlen。
以下为不显示申请内存(不用局部变量或者动态申请内存)实现strnlen(好像string.h找不到)
size_t MyStrnlen(const char* str,int maxlen)
{
assert(str!=NULL);
if(*str=='\0'||maxlen==0)
return 0;
return MyStrnlen(str+1,maxlen-1)+1;
}