C语言之—模拟实现字符串函数

1.strlen:求字符串长度

>直接用计算器实现:

    int my_strlen(const char *str)  
    {  
        int count = 0;  
        while (*str){  
            count++;  
            str++;  
        }  
        return count;  
    }  

>不创建临时变量的计数器:通过递归

    int my_strlen(const char *str)  
    {  
        if (*str=='\0'){  
            return 0;  
        }  
        else   
            return 1 + my_strlen(str + 1);  
    }  

>指针-指针:

    int my_strlen(const char *str)  
    {  
        char *p = str;     //p指向首元素  
        while (*p != '\0'){  
            p++;  
        }  
        return p - str;  
    }  

2.strcpy和strncpy:字符串拷贝:

>strcpy:将str1串复制到str2串中

    char *my_strcpy(char *dest, const char *str)  
    {  
        assert(dest);  
        assert(str);  
        while (*dest = *str){  
            dest++;  
            str++;  
        }  
        return dest;  
    }  

>strncpy:将字符串str1中指定长度复制到字符串2中:

如果指定长度大于串str1的长度,则拷贝完后再串str2后补0,直到和指定长度相等。

char *my_strncpy(char *dest,const char*str,int size)
{
	assert(dest);
	assert(str);
	assert(size > 0);
	while (size--){
		*dest = *str;
		dest++;
		str++;
	}
	*dest = '\0';
	return dest;
}

3.strcat和strncat:字符串拼接:

先使被拼接的字符串(dest)指向'\0',然后将要拼接的字符串(str)依次拷贝到dest后。

>strcat函数:

    char *my_strcat(char *dest, const char *str)  
     {  
        char *ret =dest;  
        assert(dest);  
        assert(str);  
        while (*dest){  
            dest++;  
        }  
        while (*dest = *str){  
            dest++;  
            str++;  
        }  
        return ret;  
    }  

>strncat函数:将字符串str1中指定长度拼接到字符串2中。

char *my_strncat(char*dest,const char *str,int size)
{
	assert(dest);
	assert(str);
	assert(size > 0);
	while (*dest){
		dest++;
	}
	while (size && (*dest =*str)){
		dest++;
		str++;
		size--;
	}
    return dest:
 }

4.strcmp和strncmp:字符换比较:

通过字符在ASCLL表中的位置序号进行差运算比较。比较的是ASCLL中的位置:如abcg小于abcz。

>strcmp函数:

    int my_strcmp(const char *str1,const char *str2)  
    {  
        int ret = 0;  
        while ((!(ret = *(unsigned char*)str1 - *(unsigned char*)str2)&&str1))   //一相等为基础  
     {  
            str1++;  
            str2++;  
        }  
        if (ret > 0)  
            ret = 1;  
        else if (ret<0)  
            ret = -1;  
        return (ret);  
    }  

>strncmp函数:

比较出现另一个字符不一样或者一个字符串结束或者size个字符全部比较完。

int my_strncmp(const char *dest,const char *str,int size)
{
	assert(dest);
	assert(str);
	assert(size > 0);
	int ret;
	while (size&&(!(ret=*dest-*str))){
		dest++;
		str++;
		size--;
	}
	return ret > 0 ? 1 : ret < 0 ? -1 : 0;
}
5.strstr:查找并返回子串。

在str1中查找str2并返回,str1中str2所在字符串之后的所有字符串。定义一个指针变量s指向str1,然后s与str2中的字符进行比较,如果一直比较到'\0'那么就返回str1,如果比较遇到不相等,则s指向str1的第二个字符重新开始比较。

char *my_strstr(char *str1, const char *str2)  
{  
    assert(str1);  
    assert(str2);  
    char *p = (char*)str1;  
    char *q = (char *)str2;  
    char *s = NULL;  
    while (*p){  
        s = p;  
        q = str2;  
        while (*s&&*q && (*s == *q)){  
            s++;  
            q++;  
        }  
        if (*q == '\0')  
            return p;  
        p++;  
    }  
    return 0;  
}  

6.strchr和strrchr:查找某个字符出现的位置。

>strchr函数:查找第一次字符出现的位置如果字符出现多次,以第一次找到的位置为主。

    #include<stdio.h>  
    #include<Windows.h>  
    #include<assert.h>  
    char *my_strchr(const char*str, int c)  
    {  
        assert(str);  
        while (*str){  
            if (*str == (char)c){  
                return (char*)str;  
            }  
            str++;  
        }  
        return 0;  
    }  
    int main(){  
        char *str1 = "abcdef";  
        char c = 'd';  
        char *ret = my_strchr(str1,c); //返回的是当前字符的位置  
        printf("%d\n", ret-str1+1);   //找到字符的位置减去首元素的位置加1就是当前字符在字符串中的位置  
        system("pause");  
        return 0;  
    }  

>strrchr:查找字符最后一次出现的位置并返回位置;从后往前找。

#include<stdio.h>
#include<Windows.h>
#include<assert.h>
char *my_strrchr(const char *dest, int c)
{
	assert(dest);
	char *str = dest + strlen(dest);
	while (str--){
		if (*str == (char)c){
			return (char*)str;
			break;
		}
	}
}
int main(){
	char *str = "holle world i love chnia";
	int  c = 'd';
	char*p=my_strrchr(str, c);
	printf("%d\n", p - str + 1);
	system("pause");
	return 0;
}

7.strpbrk:返回第一个字符串中第一个出现在第二个字符串中的字符的地址。

char *my_strpbrk(const char *str1, const char *str2)
{
	assert(str1);
	assert(str2);
	const char *p1, *p2;
	for (p1 = str1; *p1 != '\0'; p1++)
	{
		for (p2= str2; *p2 != '\0'; p2++)
		{
			if (*p1 == *p2)
			{
				return (char *)p1;
			}
		}
	}
	return NULL;
}

8.strspn和strcspn:

>strspn函数检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。

返回的是str1字符串中开始部分匹配str2字符串中字符的个数

int my_strspn(const char*str1, const char *str2)
{
	assert(str1);
	assert(str2);
	char *str = str1;
	while (*str){
		while (*str2 && (*str != *str2))
			str2++;
		if (*str == *str2)
			break;
		str++;
	}
	return str - str1;
}

>strcspn: 检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。

返回 str1 开头连续都不含字符串 str2 中字符的字符数.

int my_strspn(const char*str1, const char *str2)
{
	assert(str1);
	assert(str2);
	char *str = str1;
	while (*str&&*str != *str2){
		str2++;
		str++;
	}
	return str - str1;
}
9.模拟实现strtok:
(1)sep参数是个字符串,定义了用作分隔符的字符集合
(2)第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
(3)strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针。
(4)strtok函数的第一个参数不为NILL,函数找到str中第一个标记,strtok函数将保存它在字符串中的位置。
(5)strtok函数的第一个参数为空,函数将在同一个字符中被保存的位置开始,查找下一个标记。
(6)如果字符串不存在更多的标记,则返回NULL指针。
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int main(){
	char str[] = "- this, a sample string.";
	char *sep = "- ,.";
	char *p = strtok(str, sep);
	while (p != NULL){

		printf("%s\n", p);
		p = strtok(NULL, sep);
	}
	system("pause");
	return 0;
}

10.strerror:通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误。

返回错误码所对应的错误信息

#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include<errno.h>
#pragma warning( disable : 4996)
int main(){
	FILE *pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL){
		printf("Error opean file unexist.ent:%s\n", strerror(errno));
	}
	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_41889292/article/details/80404501