C語言基礎字串函式原始碼
阿新 • • 發佈:2018-12-16
#include <stdio.h> #include <assert.h> /* * 作用:獲取串str的長度 */ int strlen(const char *pcStr) { assert(pcStr != NULL); int iLen = 0; while ('\0' != *pcStr) { pcStr++; iLen++; } return iLen; } /* * 前提:strDes指向的記憶體至少能夠容納(strlen(strDes) + strlen(strSrc) + 1) bytes * 作用:將串strSrc連線到串strDes的末尾,函式本身不保證安全(使用不當會記憶體溢位) */ char *strcat(char *pcStrDest, const char *pcStrSrc) { assert((pcStrDest != NULL) && (pcStrSrc != NULL)); char *pcTemp = pcStrDest; /* pcStrDes指標指向串pcStrDes的末尾 */ while ('\0' != *pcStrDest) { pcStrDest++; } /* 依次從源串pcStrSrc不斷拷貝字元到目的串pcStrDes中 */ while ('\0' != *pcStrSrc) { *pcStrDest = *pcStrSrc; pcStrSrc++; pcStrDest++; } *pcStrDest = *pcStrSrc; return pcTemp; } /* * 前提:strDes指向的記憶體至少能夠容納(strlen(strSrc) + 1) bytes * 作用:將串strSrc拷貝到strDes指向的記憶體空間,函式本身不保證安全(使用不當會記憶體溢位) */ char *strcpy(char *pcStrDest, const char *pcStrSrc) { assert((pcStrDest != NULL) && (pcStrSrc != NULL)); char *pcTemp = pcStrDest; while ('\0' != *pcStrSrc) { *pcStrDest = *pcStrSrc; pcStrSrc++; pcStrDest++; } *pcStrDest = *pcStrSrc; return pcTemp; } /* * 作用:按字典序比較串s和串t的大小 */ int strcmp(const char *pcStrA, const char *pcStrB) { assert((pcStrA != NULL) && (pcStrB != NULL)); while (('\0' != *pcStrA) && ('\0' != *pcStrB) && (*pcStrA == *pcStrB)) { pcStrA++; pcStrB++; } return (int)(*pcStrA - *pcStrB); } /* * 前提:strDes指向的記憶體至少能夠容納(strlen(strDes) + count + 1) bytes * 作用:將串strSrc的前count個字元連線到串strDes的末尾,函式本身不保證安全(使用不當會記憶體溢位) */ char *strncat(char *pcStrDest, const char *pcStrSrc, int iCount) { assert((pcStrDest != NULL) && (pcStrSrc != NULL)); char *pcTemp = pcStrDest; while ('\0' != *pcStrDest) { pcStrDest++; } while ((iCount > 0) && ('\0' != *pcStrSrc)) { *pcStrDest = *pcStrSrc; pcStrSrc++; pcStrDest++; iCount--; } *pcStrDest = '\0'; return pcTemp; } /* * 前提:strDes指向的記憶體至少能夠容納(count + 1) bytes * 作用:將串strSrc的前count個字元拷貝到strDes指向的記憶體空間,函式本身不保證安全(使用不當會記憶體溢位) */ char *strncpy(char *pcStrDest, const char *pcStrSrc, int iCount) { assert((pcStrDest != NULL) && (pcStrSrc != NULL)); char *pcTemp = pcStrDest; while ((iCount > 0) && ('\0' != pcStrSrc)) { *pcStrDest = *pcStrSrc; pcStrSrc++; pcStrDest++; iCount--; } return pcTemp; } /* * 作用:按字典序比較串s和串t的前count個字元的大小 */ int strncmp(const char *pcStrA, const char *pcStrB, int iCount) { assert((pcStrA != NULL) && (pcStrB != NULL)); while (('\0' != *pcStrA) && ('\0' != *pcStrB) && (*pcStrA == *pcStrB) && (iCount > 0)) { iCount--; if (0 == iCount) { break; } pcStrA++; pcStrB++; } return (int)(*pcStrA - *pcStrB); } /* * 前提:dest指向的記憶體能夠容納count bytes * 作用:將src所指向記憶體的count bytes拷貝到的dest指向的記憶體 */ void *memcpy(void *pvDest, const void *pvSrc, int iCount) { assert((pvDest != NULL) && (pvSrc != NULL)); void *pvTemp = pvDest; char *pcDest = (char *)pvDest; const char *pcSrc = (const char *)pvSrc; while (iCount > 0) { *pcDest = *pcSrc; pcDest++; pcSrc++; iCount--; } return pvTemp; } /* * 作用:將str的前count個位元組置為字元c */ void *memset(void *pvSrc, int iCh, int iCount) { assert(pvSrc != NULL); char *pcSrc = (char *)pvSrc; while (iCount > 0) { *pcSrc = (char)iCh; pcSrc++; iCount--; } return pvSrc; } /* * 作用:將src所指向記憶體的count bytes拷貝到的dest指向的記憶體(解決了memcpy未解決的記憶體重疊問題) */ void *memmove(void *pvDest, const void *pvSrc, int iCount) { assert((pvDest != NULL) && (pvSrc != NULL)); void *pvTemp = pvDest; char *pcDest = (char *)pvDest; const char *pcSrc = (const char *)pvSrc; // 邏輯: // 1)在src小於dest前提下,然後判斷src+count指向的記憶體是否與dest指向的記憶體重疊 // 2) 如果重疊則從src+count開始複製,複製到dest+count,從後往前拷貝count位元組 if ((pvSrc < pvDest) && (pvSrc + iCount > pvDest)) { pcDest = pcDest + iCount - 1; pcSrc = pcSrc + iCount - 1; while (iCount > 0) { *pcDest = *pcSrc; pcDest--; pcSrc--; iCount--; } } else { while (iCount > 0) { *pcDest = *pcSrc; *pcDest++; *pcSrc++; iCount--; } } return pvTemp; } int main() { int iLen = 0; int iRet = 0; char acBuffer[4] = {0}; char *pcTestStr1 = "Today is sunday."; char acTestStr2[] = "Today"; char acTestStr3[] = "Today is sunday."; char acTestStr4[sizeof("Today is ") + sizeof("sunday.") - 1] = "Today is "; iLen = strlen(pcTestStr1); printf("iLen = %d\n", iLen); (void)strncpy(acBuffer, pcTestStr1, sizeof(acBuffer) - 1); printf("acBuffer:%s\n", acBuffer); iRet = strncmp(pcTestStr1, acTestStr2, strlen(acTestStr2)); printf("strncmp iRet = %d\n", iRet); iRet = strcmp(pcTestStr1, acTestStr2); printf("strcmp iRet = %d\n", iRet); (void)memmove(&acTestStr3[1], &acTestStr3[0], strlen("Today")); printf("memmove acTestStr3:%s\n", acTestStr3); printf("before strncat acTestStr4:%s\n", acTestStr4); (void)strncat(acTestStr4, "sunday.111", sizeof(acTestStr4) - strlen(acTestStr4) - 1); printf("after strncat acTestStr4:%s\n", acTestStr4); return 0; }