1 size_t my_strlen(const char *string); // 字符串长度
size_t my_strlen(const char *string) // 字符串长度
{
int len = 0;
const char *str = string;
if(string == NULL){
return len;
}
while(str[len++] != '\0');
return len;
}
2 char *my_strcpy(char *des_str, const char *src_str); //字符串拷贝
char *my_strcpy(char *des_str, const char *src_str) //字符串拷贝
{
char *des = des_str;
const char *src = src_str;
if(des_str == NULL || src_str == NULL
|| des_str == src_str){
return des_str;
}
while((*des++ = *src++) != '\0'){
/*do nothing*/
}
return des_str;
}
这个是带长度的,实际上也没有多大的区别
char *my_strncpy(char *des_str, const char *src_str, size_t num)
{
char *des = des_str;
const char *src = src_str;
if(des_str == NULL || src_str == NULL
|| des_str == src_str || num <= 0){
return des_str;
}
while( num-- && (*des++ = *src++) != '\0'){
/*do nothing*/
}
return des_str;
}
3 char *my_strcat(char *des_str, const char *src_str); //字符串链接,这个里面用到了my_strlen,尽量不要重复造轮
char *my_strcat(char *des_str, const char *src_str) //字符串链接
{
char *des = des_str;
const char *src = src_str;
int des_len = 0;
if(des_str == NULL || src_str == NULL){
return NULL;
}
des_len = my_strlen(des_str);
des += des_len; //让des指向‘\0‘
// my_strcpy(des, src);
while((*des++ = *src++) != '\0');
return des_str;
}
这个也是比较安全的my_strncpy
char *my_strncpy(char *des_str, const char *src_str, size_t num)
{
char *des = des_str;
const char *src = src_str;
if(des_str == NULL || src_str == NULL
|| des_str == src_str || num <= 0){
return des_str;
}
while( num-- && (*des++ = *src++) != '\0'){
/*do nothing*/
}
return des_str;
}
4 int my_strcmp(const char *string1, const char *string2); //字符串的比较
int my_strcmp(const char *string1, const char *string2) //字符串的比较
{
const char *str1 = string1;
const char *str2 = string2;
// hello\0 str1
//
// hello,world! str2
//
// hello,world! str1
//
// hello\0 str2
assert((string1 != NULL) && (string2 != NULL));
while(*str1 && *str2 && *str1 == *str2){
str1++;
str2++;
}
return (*str1 - *str2);
}
5 //字符的查找,返回值为地址
char *my_strchr(const char *string, int ch);
/字符的查找,返回值为地址
char *my_strchr(const char *string, int ch)
{
const char *str = string;
if(string == NULL){
return NULL;
}
while(*str != '\0'){
if(*str == (char)ch){
return (char *)str;
}
str++;
}
return NULL;
}
6 //字符查找,返回值为下标
int find_index(const char *string, int ch);
//字符查找,返回值为下标
int find_index(const char *string, int ch)
{
char *find = my_strchr(string, ch);
if(find != NULL){
return find - string;
}else{
return -1;
}
}
7 //字符查找,最后一次出现的位置
char *strrchr(const char *string, int ch);
//字符查找,最后一次出现的位置
char *strrchr(const char *string, int ch)
{
const char *str = string;
char *p_char = NULL;
if(string == NULL){
return p_char;
}
while(*str != '\0'){
if(*str == (char)ch){
p_char = (char *)str;
}
str++;
}
return p_char;
}
8 //从头到尾匹配string中的字符,返回首次失配前能够匹配的字符个数
size_t my_strspn(const char *string, const char *accept);
size_t my_strspn(const char *string, const char *accept)
{
const char *str = string;
const char *acc = NULL;
if(string == NULL || accept == NULL){
fprintf(stderr, "argument is invalid!\n");
exit(1);
}
//hello,world string
//
//elho accept
//
// 11 * 4
//
//
while(*str != '\0'){
acc = accept;
while(*acc != '\0'){
if(*acc == *str){
break ;
}
acc++;
}
if(*acc == '\0'){
return str - string;
}
str++;
}
}