1. 程式人生 > >【C學習筆記】C語言實現Delphi的Pos()、Copy()、Delete()函式

【C學習筆記】C語言實現Delphi的Pos()、Copy()、Delete()函式

最近在學習C,深感C指標的強大(和危險),掌握得好,則對記憶體控制如魚得水;掌握不好,輕則得到亂碼,程式異常退出,重則系統藍屏宕機。都說指標是C的靈魂,一點也不為過。

今天拿指標來小試,寫三個字串處理函式,即Delphi中的Pos()、Copy()、Delete()函式。原因很明顯,哥也是Delphi的忠實粉絲。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

/*返回str中子串substr所在的位置*/
int Pos(const char* str, const char* substr)
{
	char* res = strstr(str, substr);
	if (res) return res - str;	else return 0;
}

/*返回從n開始到count個字元的字串*/
char *Copy(const char* str, int iStartPos, int count)
{
	if (iStartPos < 0) iStartPos = 0;
	if (count <= 0) return "";
	if (iStartPos >= strlen(str)) return "";

	int ileft = strlen(str) - iStartPos;
	int isize = ileft >= count ? count : ileft;
	if (isize<=0) return ""; 

	char* res = (char*)calloc(isize + 1, sizeof(char)); /*分配記憶體,並用\0填充;*/
	if (!res) return "";

	int i = 0;
	while (i<isize)
	{
		*(res + i) = *(str + iStartPos + i); /*從str中指定位置逐位複製isize個字元過來;*/
		i++;
	}
	//*(res + isize) = '\0'; /*calloc分配可以不用這一句;用malloc分配需要這句;	*/
	return res;
}

char* DeleteStr(const char* str, int iStartPos, int count)
{
	int len = strlen(str);
	if (iStartPos <= 0) iStartPos = 0;
	if ((count <= 0) || (iStartPos >= len))  return str;

	if (count >= len - iStartPos) count = len - iStartPos;
	int isize = len - count ;/* 最終結果的長度;*/
	char* res = (char*)calloc(isize + 1, sizeof(char));  /*分配原字串長度+1的記憶體,並用\0填充;*/
	int i = 0; int j = 0;
	while (i<len)
	{
		if ((i >= iStartPos) && (i < iStartPos + count)) /*如果屬於刪除範圍內的,直接跳過*/
		{			
			i++;
			continue;
		}
		*(res + j) = *(str + i); /*複製相應字元;*/
		i++; j++;
	}
	//*(res + j) = '\0'; /*用calloc分配記憶體不需要這句;用malloc分配則需要;*/
	return res;
}


int main()
{
	/*            012345678901234567   ->位置參考*/
	char *str1 = "C language is fun!";
	char *str2 = "fun";
	/*返回str2在str1中的首次出現的位置;*/
	printf("測試Pos(str1,str2)=%d\n",Pos(str1, str2)); 

	/*返回str1中第2位開始後4個字元;*/
	printf("測試Copy(str1,2,8)=%s\n",str1,Copy(str1,2,4)); 

	/*刪除str1中從第2個字元開始以及之後的9個字串*/
	printf("測試Delete(%s,2,9)=%s\n",str1,DeleteStr(str1,2,9)); 
	
	system("pause");
	return 0;
}

簡單測試一下: