C语言库函数中strlen、strcmp、strcpy、strcat是我们非常常用的一些字符串处理函数,我们不得不了解一下内部的工作原理,有必要思考如果没有这些库函数我们该如何实现这些函数的功能。以深入的了解字符串内部的处理机制。本文就记录了一些前辈们留下的非常简练的实现。
#include <stdio.h> #include <stdlib.h> int myStrlen(const char* str); char* myStrcpy(char* dest, const char* src); int myStrcmp(const char* dest, const char* src); void myStrcat(char* dest, char* src); int main(int argc, char *argv[]) { char buf[20]; char sz[] = "dengjia"; int nCmp; int nLen; nLen = myStrlen(sz); printf("%d\n", nLen); myStrcpy(buf, sz); printf("%s--%s\n", buf, sz); nCmp = myStrcmp(buf, sz); printf("%d\n", nCmp); myStrcat(buf, sz); printf("%s\n", buf); system("pause"); return 0; } void myStrcat(char* dest, char* src) { // 先将被追加字符串的指针指到\0 while (*dest) dest++; // 像strcpy一样将src追加到dest中 while (*dest++ = *src++); } int myStrcmp(const char* dest, const char* src) { // 循环条件每个字符都相等 // 并且两个字符串都没有到结尾 // 一旦以上某个条件不满足则跳出while while (*dest == *src && *dest != '\0' && *src != '\0') { dest++; src++; } // 此时计算最后指向的两个字符的差值,返回对应值即可 return *dest > *src ? 1 : (*dest == *src ? 0 : -1); } int myStrlen(const char* str) { int nLen = 0; // 遍历字符串每一个字符,直到遇到\0为止,每循环一次给nLen加1 while (*str++) nLen++; // 返回最终结果 return nLen; } char* myStrcpy(char* dest, const char* src) { // 备份原指针 char* tmp = dest; // 把源字符串每一个字符拷贝到目标字符串中 // 在循环条件中使用后++可减少代码行数,并且不会出问题 // 最后字符指针指向src的\0位置 while (*tmp++ = *src++); // 返回备份的指针,这样可以重叠使用myStrcpy函数 // 例:myStrcpy(dest, myStrcpy(d,s)); return dest; }