文章目录
一、字符串函数
在使用字符串库函数时,要引头文件#include <string.h>
1.strlen
size_t strlen( const char *string );
strlen在求字符串长度时,以’\0’作为结束标志,返回字符串中’\0’之前出现的字符个数。同时,strlen函数的返回类型为size_t,是无符号的。
//模拟实现strlen
//1.计数
#include <assert.h>
int my_strlen1(const char* s)
{
assert(s);
int count = 0;
while (*s++)
count++;
return count;
}
//2.递归
int my_strlen2(const char* s)
{
assert(s);
if (*s)
return 1 + my_strlen2(s + 1);
else
return 0;
}
//3.指针减指针
int my_strlen3(const char* s)
{
assert(s);
char* tmp = s;
while (*tmp++)
;
return tmp - s - 1;
}
2.strcpy
char *strcpy( char *strDestination, const char *strSource );
strcpy拷贝源字符串到目的字符串,直到将源字符串中的‘\0’拷贝到目的字符串之后停止。所以目的字符串的空间必须足够大,源字符串必须以‘\0’停止。
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* tmp = dest;
while (*dest++ = *src++)
;
return tmp;
}
3.strcat
char *strcat( char *strDestination, const char *strSource );
strcat在目标字符串后追加一个字符串,目的字符串的空间必须足够大,源字符串必须以‘\0’停止。
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* tmp = dest;
while (*dest++)
;
dest--;
while (*dest++ = *src++)
;
return tmp;
}
4.strcmp
int strcmp( const char *string1, const char *string2 );
strcmp用来比较两个字符串,如果第一个字符串大于第二个字符串,返回大于0的数字;如果第一个字符串等于第二个字符串,返回0;如果第一个字符串小于第二个字符串,返回小于0的数。
#include <assert.h>
int my_strcmp(const char* s1, const char* s2)
{
while (*s1 == *s2)
{
if (*s2 == '\0')
return 0;
s1++;
s2++;
}
return *s1 - *s2;
}
5.strncpy
char *strncpy( char *strDest, const char *strSource, size_t count );
strncpy从源字符串拷贝n个字符到目标字符串,如果源字符串的长度小于n,则拷贝完源字符串之后,在目标的后面追加0,直到n个。
#include <assert.h>
char* strncpy(char* dest, const char* src, size_t n)
{
assert(dest && src);
char* tmp = dest;
while (n--)
{
*dest = *src;
dest++;
if (*src != '\0')//如果没有拷贝完源字符串
src++;
}
return tmp;
}
6.strncat
char *strncat( char *strDest, const char *strSource, size_t count );
strncat在目标字符串后追加n个字符,如果超出源字符串的长度,则只追加一个源字符串。strncat会在追加字符串的末尾放一个‘\0’。
char* my_strncat(char* dest, const char* src, size_t num)
{
assert(dest && src);
char* tmp = dest;
int len = strlen(src);
while (*dest++)
;
dest--;
int k = len < num ? len : num;
while (k--)
{
*dest++ = *src++;
}
*dest = '\0';
return tmp;
}
7.strncmp
int strncmp( const char *string1, const char *string2, size_t count );
strncmp比较两个字符串在n个字节里的关系。
#include <assert.h>
int my_strncmp(const char* dest, const char* src, size_t num)
{
assert(dest && src);
int k = 0;
while (*dest++ == *src++)
{
k++;
if (k == num)
return 0;
}
return *--dest - *--src;
}
8.strstr
char *strstr( const char *string, const char *strCharSet );
strstr判断第二个字符串是不是第一个字符串的子串,如果是,返回第一个字符串中找到子串的地址,找不到返回NULL。
char* my_strstr(const char* s1, const char* s2)
{
assert(s1 && s2);
if (*s2 == '\0')
return (char*)s1;
char* str1 = NULL;
char* str2 = NULL;
char* p = (char*)s1;
while (*p)
{
str1 = p;
str2 = (char*)s2;
while (*str1 && *str2 && *str1 == *str2)
{
str1++;
str2++;
}
if (!*str2)
return p;
p++;
}
return NULL;
}
二、字符函数
在使用字符库函数时,要引头文件#include <ctype.h>
常见的字符函数:
isspace :空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit :十进制数字 0~9
isxdigit :十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A-F
islower : 小写字母a~z
isupper :大写字母A~Z
isalnum :字母或者数字,a-z,A-Z,0~9
tolower :大写字母转小写
toupper :小写字母转大写
以上函数在调用时,如果表达式判断为真,返回一个非0的值,如果为假,返回0。
三、内存函数
在使用内存函数时,要引头文件#include <string.h>
1.memcpy
void *memcpy( void *dest, const void *src, size_t count );
memcpy从src的位置向后复制count个字节到dest,如果dest和src有任何的重叠,复制的结果时未定义的,所以在赋值有重叠部分的时候,应使用memmove。
#include <assert.h>
void my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
char* d = (char*)dest;
char* s = (char*)src;
while (num--)
{
*d++ = *s++;
}
return dest;
}
2.memmove
void *memmove( void *dest, const void *src, size_t count );
如果dest和src有任何的重叠,就应该使用memmove处理。
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
char* d = (char*)dest;
char* s = (char*)src;
if (d < s)
{
while (num--)
*d++ = *s++;
}
else
{
while (num--)
*(d + num) = *(s + num);
}
return dest;
}
3.memcmp
int memcmp( const void *buf1, const void *buf2, size_t count );
比较从buf1 和 buf2 开始的count 个字节,返回值同strcmp。
int my_memcmp(const void* e1, const void* e2, size_t num)
{
assert(e1 && e2);
char* a1 = (char*)e1;
char* a2 = (char*)e2;
int k = 0;
while (*a1++ == *a2++)
{
k++;
if (k == num)
return 0;
}
return *--a1 - *--a2;
}