自己动手写字符串库函数 四(C语言实现) 分类: C语言学习 2015-01-20 23:03 157人阅读 评论(0) 收藏

上一篇 自己动手写字符串库函数 三(C语言)

//重置
void my_StrSet(string *des, const char ch)
{
	if (!IsEmpty(des))
		return;
	else
	{
		char* des1 = des->str;
		int  desLen = my_StrLen(des->str);
		while (desLen--)
			*des1++ = ch;
	}
}
//插入字符串
void my_InsertStr(string*strs, const char * sour, int pos)
{
	if (!IsEmpty(strs) || sour == NULL)
		return;
	int desLen = strs->len;
	int sourLen = my_StrLen(sour);
	int allLen = desLen + sourLen;
	int flag = pos;
	if (pos<0 || pos>desLen)
		return;
	strs->str = (char*)realloc(strs->str, desLen + sourLen + sizeof(char));
	if (strs->str == NULL)
		return;
	char* des1 = strs->str;
	strs->len = sourLen + desLen + sizeof(char);
	while (desLen >= pos)
		*(des1 + (desLen--) + sourLen) = *(des1 + desLen);
	while (pos < flag + sourLen)
		*(des1 + pos++) = *sour++;
	//将最后一个位置的字符设置''
	*(des1 + strs->len) = 0;
}
void my_DelPosStr(string*strs, int start, int end)
{
	if (!IsEmpty(strs))
		return;
	int desLen = my_StrLen(strs->str);
	if ((start < 0 || end <= start) || (start>desLen || end>desLen))
		return;
	int len = end - start;
	char*des1 = strs->str;
	//strs->len -= len;
	while (end <= desLen)
	{
		*(des1 + start++) = *(des1 + end++);
	}
	strs->len -= len;
}
//将字符串转为整数  那么如果将数字转为字符也是简单的事
void my_atoi(string*strs, int* num)
{
	if (!IsEmpty(strs) || num == NULL)
		return;
	char* des = strs->str;
	//1.检测能不能转换 
	for (size_t i = 0; i < strs->len - 1; i++)
	{
		if (*(des + i)<'0' || *(des + i)>'9')  //不能转换
			return;
	}
	int result = 0;
	while (*des != '')
	{
		result *= 10;
		result += *des++ - 48; //那么如果将数字转为字符也是简单的事
	}
	*num = result;
}

//字符串比较  大返回1,小于返回0,相等返回2
int my_strcmp(char*strs, char * sour)
{
    if (!IsEmpty(&strs) || sour == NULL)
        return;
    char*des = strs;
    while (*sour != '')
    {
        if (*sour == *des)
        {
            sour++;
            des++;
            if (*sour == '' && *des == '')
                return 2;
        }
        else
        {
            if (*des > *sour)
                return 1;
            else
                return 0;
        }
    }
    return 1;
}

//字符串比较 忽略大小写 
//对原来的字符串没有影响
int my_stricmp(char*strs, const char * sour)
{
    if (!IsEmpty(&strs) || sour == NULL)
        return;
    int desLen = my_StrLen(strs);
    int sourLen = my_StrLen(sour);
    char* des = (char*)malloc(desLen + 1);
    strcpy(des, strs);
    char*sour1 = (char*)malloc(sourLen + 1);
    strcpy(sour1, sour);
    int len = desLen <= sourLen ? desLen : sourLen;
    //将大写转为小写
    for (int i = 0; i < len; i++)
    {
        if (!((*(des + i) >= 'A' && *(des + i) <= 'Z')))
            *(des + i) = *(des + i) - 32;
        if (!((*(sour1 + i) >= 'A' && *(sour1 + i)  <= 'Z')))
                *(sour1 + i) = *(sour1 + i) - 32;
    }
    return my_strcmp(des, sour1);
}




//测试代码  main函数
#include "String.h"

int main()
{
    string strs;
    int *num = (int*)malloc(sizeof(int));
    Init_With_Str(&strs, "tasklist");
    //my_InsertChar(&strs,'A',11);
    //my_DelPosChar(&strs,1);
    //my_StrSet(&strs,'A');
    /*my_InsertStr(&strs, "abc", 8);
    my_DelPosStr(&strs,10,11);*/

    /*my_StrSet(&strs,'1');
    my_atoi(&strs, num);
    */
    my_StrCopy(&strs,"1234567");
    my_atoi(&strs, num);
    printf("%d
", *num);
    free(num);  //释放内存
    num=NULL;
     //Print_String(&strs);
    getchar();
    return 0;
}

总结:写到这里算是对字符串处理,告一段落了,写完了才发现,字符串的处理就是对数组链表的处理,其实这里对效率没有要求,新手了,算是对指针的联系了,最后我把源码贴出,由于都是晚上写,肯定有错误支出,希望大家能谅解,我会及时更正

http://download.csdn.net/detail/mingyueruya/8381295

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/L-Lune/p/4671287.html