【C學習筆記】C語言實現Delphi的Pos()、Copy()、Delete()函式
阿新 • • 發佈:2018-12-13
最近在學習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; }
簡單測試一下: