This code was originally created by blogger Huang Renlai. For reprint, please indicate the source: https://blog.csdn.net/weixin_43334745
2018-10-05
Recently, I am learning C, deeply aware of the power (and danger) of the C pointer. If I master it well, I will control the memory like a fish in water; if I master it badly, I will get random code, if the program exits abnormally, and if I don't master it well, I will crash the blue screen of the system. It is said that the pointer is the soul of C, which is not too much.
Today, take the pointer for a test and write three string processing functions, namely, Pos(), Copy(), Delete() in Delphi. The reason is obvious. Brother is also a big fan of Delphi.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> /*Return the location of substr of str substring*/ int Pos(const char* str, const char* substr) { char* res = strstr(str, substr); if (res) return res - str; else return 0; } /*Returns a string of count characters from iStartPos in str*/ 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)); /*Allocate memory and fill it with \ 0;*/ if (!res) return ""; int i = 0; while (i<isize) { *(res + i) = *(str + iStartPos + i); /*Copy isize characters one by one from the specified position in str;*/ i++; } //*(RES + isize) = '\ 0'; / * this sentence can be used for calloc allocation; this sentence is required for malloc allocation*/ return res; } /*Delete str from the iStartPos position, a total of count characters, and return*/ 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 ;/* The length of the final result;*/ char* res = (char*)calloc(isize + 1, sizeof(char)); /*Allocate the memory of the original string length + 1 and fill it with \ 0;*/ int i = 0; int j = 0; while (i<len) { if ((i >= iStartPos) && (i < iStartPos + count)) /*If it is within the scope of deletion, skip directly*/ { i++; continue; } *(res + j) = *(str + i); /*Copy the corresponding characters;*/ i++; j++; } //*(res + j) = '(RES + J) = '\ 0''; / * it is not necessary to allocate memory with calloc; it is necessary to allocate memory with malloc*/ return res; } int main() { /* 012345678901234567 ->Location reference*/ char *str1 = "C language is fun!"; char *str2 = "fun"; /*Returns the first occurrence of str2 in str1;*/ printf("test Pos(str1,str2)=%d\n",Pos(str1, str2)); /*Return 4 characters after the start of the second bit in str1;*/ printf("test Copy(str1,2,8)=%s\n",str1,Copy(str1,2,4)); /*Delete 9 strings in str1 starting from and after the second character*/ printf("test Delete(%s,2,9)=%s\n",str1,DeleteStr(str1,2,9)); system("pause"); return 0; }
A simple test:
Keep a problem: after malloc or calloc is used to allocate memory in a function, it usually needs to be free, but after the function return, it cannot be free. If it is free before the return, it will return an error result, So?