1. 程式人生 > >自己動手寫字串庫函式 一(C語言實現)

自己動手寫字串庫函式 一(C語言實現)

在coding中最常使用的就是對於字串的處理問題,接下來我們自己動手寫庫函式,儘量使用指標操作,而不是陣列操作

//標頭檔案 string.h
#include <stdio.h>
#include <stdlib.h>

//字串結構體
typedef struct CString
{
	char* str;
	int len;
}string;

//初始化
void Init(string* str);
void Init_With_Len(string* str, int len);
void Init_With_Str(string*str, const char*strcopy);
//列印字串
void Print_String(string*str);
//追加字元
void Append_Char(string*str, const char s);
//追加字串
void Append_Str(string*str, const char*s);
//計算字串的長度
int my_StrLen(const char*str);
//字串複製
char* my_StrCopy(string*des, const char*sour);
//字串連線
char* my_StrCat(string*des, char* sour);
//字元查詢
char* my_Strchr(string*des, char ch);
//字串查詢
char* my_FindStr(string*des, char*sour);
//刪除指定的字元
void my_DelChar(string*des, char ch);
//指定的位置插入字元
void my_InsertChar(string*des, char ch,int pos);
//判斷是否為空
int IsEmpty(string*strs);
//函式的具體實現 string.c
#include "String.h"

//判斷是否為空
int IsEmpty(string*strs)
{
	//先判斷strs是否為空 再判斷strs->str是否為空
	if (strs == NULL || strs->str == NULL)
		return 0;
	else
		return 1;
}

//獲取字串的長度
int my_StrLen(const char*str)
{
	if (str == NULL)
		return -1;
	int count = 0;
	while (*str++ != '\0')
		count++;
	return count;
}

//初始化
void Init(string* str)
{
	str->str = NULL;
	str->len = 0;
}

void Init_With_Len(string*str, int len)
{
	str->str = (char*)calloc(len, sizeof(char));
	str->len = len;
}

void Init_With_Str(string*strs, const char* strcopy)
{
	if ( IsEmpty(strs) != 0|| strcopy == NULL)
		return;
	else
	{
		//計算字串的長度
		int count = my_StrLen(strcopy);
		//注意使用calloc進行空間的分配  count+sizeof(char) 是為了最後一個放入'\0'
		strs->str = (char*)calloc(count + sizeof(char), sizeof(char));
		strs->len = count + sizeof(char);
		//strcpy(strs->str, strcopy);
		strs->str = my_StrCopy(strs, strcopy);
	}
}

//字串複製
char* my_StrCopy(string*des, const char*sour)
{
       if (des->str == NULL || sour == NULL)
        return NULL;
    char* strTmp = des->str;
    int sourLen = my_StrLen(sour);
    while (*sour != '\0')
        *strTmp++ = *sour++;
    *(des->str + sourLen) = '\0';
    des->len = sourLen;
    return des->str;
}


//列印字串
void Print_String(string* strs)
{
	if (IsEmpty(strs) != 0)
		printf("%s\n ", strs->str);
	else
		return;
}

//主函式中測試 main.c
#include "String.h"

int main()
{
	string strs;
	Init_With_Str(&strs,"tasklist"); 
    Print_String(&strs);//result: tasklist
}