string库里主要有以下几种函数是日常使用比较多的strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmpstrlen原型如下返回为typedefine的size_t类型实际为long int型参数为字符串的长度。size_t strlen(const char *s);size_t Strlen(const char *s) { size_t i 0; while(*(si)!\0) i; return i; }接收一个常量字符串指针返回字符串有效字符个数不统计末尾结束符\0返回类型为无符号整数size_t。const char *s传入字符串首地址const保证函数内不会修改原字符串内容只读访问。size_t i 0;定义计数器 i初始值 0用来记录已经遍历过的字符数量。当访问到内存中值为\0的终止符时循环条件不成立直接跳出循环。return i;此时 i 的值就是\0之前所有有效字符的总数和标准strlen返回值完全一致strcpy原型如下把 src 整串包含\0复制到 dest覆盖原有内容。char *strcpy(char *dest, const char *src);char *Strcpy(char *dest,const char *src) { char *ret dest; while(*src ! \0) { *dest *src; dest; src; } *dest \0; return ret; }函数首先备份目标字符串 dest 的起始地址至 ret 变量避免后续指针偏移后丢失首地址随后进入循环判断源指针 src 指向内容是否不为结束符 \0若满足条件则将 src 当前字符赋值给 dest 对应位置再同时将两个指针向后自移一位继续拷贝直至读取到源字符串终止符退出循环紧接着在 dest 当前指向位置手动赋值 \0 保证目标字符串格式合法最后返回预先保存的目标数组首地址。strncpy最多拷贝n个字节使用方法和函数原型如下src 长度 ≤ n正常拷贝 带上\0src 长度 n只拷 n 个字符不会自动补 \0char *strncpy(char *dest, const char *src, size_t n);char *Strncpy(char *dest,const char *src,size_t n) { char *ret dest; while(*src ! \0 n0) { *dest *src; dest; src; n--; } while(n) { *dest \0; n--; dest; } return ret; }首先将目标地址 dest 备份到 ret 指针用于最终返回随后进入第一层循环循环条件同时判定源指针未指向字符串结束符且剩余可拷贝长度 n 大于 0满足条件时将源指针当前字符赋值给目标指针对应内存两个指针同步向后偏移一位并将计数 n 减一当源字符串提前结束或拷贝达到指定长度 n 时退出第一层循环接着进入第二层循环对剩余未使用的 n 个字节全部填充赋值为 \0最后返回最初保存的目标数组起始地址。strcat字符串拼接原型如下找到 dest 末尾的\0把 src 追加在后面自动追加新\0。char *strcat(char *dest, const char *src);char *Strcat(char *dest,const char *src) { char * ret dest; while(*dest ! \0) dest; while(*src ! \0) { *dest *src; dest; src; } *dest \0; return ret; }先备份目标字符串起始地址到 ret 指针以便最终返回第一个循环不断向后移动 dest 指针直至找到目标字符串原本的 \0 结束位置随后开启第二个循环将源字符串 src 逐个字符赋值到 dest 当前位置每完成一次赋值就同步递增 dest 与 src 指针直至遍历完源字符串所有有效字符循环结束后在 dest 当前地址手动写入 \0 保证拼接后的字符串合规最后返回最初保存的 dest 首地址方便链接调用。strncat指定字符长度拼接用法和原型如下最多追加 n 个字符一定会在末尾自动补上 \0char *strncat(char *dest, const char *src, size_t n);char *Strncat(char *dest,const char *src,size_t n) { char * ret dest; while(*dest) dest; while(*src n) { *dest *src; dest; src; n--; } *dest \0; return ret; }首先将目标字符串起始地址备份至 ret 指针用于最终返回通过第一个 while 循环持续后移 dest 指针定位到原目标字符串末尾的结束符位置随后进入第二个循环在源字符串未遍历完毕且可追加长度 n 大于 0 的条件下逐个将 src 指向字符赋值给 dest 内存单元同时两个指针同步向后偏移、计数 n 递减当源字符串读取结束或是达到最大追加长度 n 时终止拷贝循环紧接着在 dest 当前指向位置强制写入字符串结束符 \0 确保拼接结果为合法 C 语言字符串最后返回预先保存的目标数组首地址测试结果如下strcmp整串字符串大小比较主要用法如下返回 0两个字符串完全相等返回 0s1 大于 s2返回 0s1 小于 s2。int strcmp(const char *s1, const char *s2);int Strcmp(const char *s1,const char *s2) { while(*s1 *s2 *s1 ! \0 *s2 ! \0) { s1; s2; } return *s1-*s2; }直接接收两个只读字符串指针 s1 和 s2进入循环判定当前两个指针指向字符相等且均未遍历到各自字符串结束符时同步将两个指针向后偏移一位继续对比一旦出现字符不相等或任意一方抵达字符串末尾就退出循环最终返回当前 s1 指向字符 ASCII 值减去 s2 指向字符 ASCII 值的差值返回值为 0 代表两字符串完全一致大于 0 代表 s1 大于 s2小于 0 代表 s1 小于 s2strncmp只比较前 N 个字符int strncmp(const char *s1, const char *s2, size_t n);int Strncmp(const char *s1,const char *s2,size_t n) { while(*s1 *s2 *s1 *s2 n1) { s1; s2; n--; } return *s1-*s2; }接收两个只读字符串指针与无符号长度参数 n循环条件判定当前两指针字符相等、均未到达字符串结束符且剩余可比较次数大于 1 时同步向后移动两个字符指针并递减计数 n不满足任一条件则跳出循环最终返回当前 s1 指向字符与 s2 指向字符的 ASCII 码差值差值为 0 说明指定前缀内容完全相同正数代表 s1 对应位置字符更大负数则代表 s2 更大测试部分结果如下
C语言-指针实现string库函数内容
string库里主要有以下几种函数是日常使用比较多的strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmpstrlen原型如下返回为typedefine的size_t类型实际为long int型参数为字符串的长度。size_t strlen(const char *s);size_t Strlen(const char *s) { size_t i 0; while(*(si)!\0) i; return i; }接收一个常量字符串指针返回字符串有效字符个数不统计末尾结束符\0返回类型为无符号整数size_t。const char *s传入字符串首地址const保证函数内不会修改原字符串内容只读访问。size_t i 0;定义计数器 i初始值 0用来记录已经遍历过的字符数量。当访问到内存中值为\0的终止符时循环条件不成立直接跳出循环。return i;此时 i 的值就是\0之前所有有效字符的总数和标准strlen返回值完全一致strcpy原型如下把 src 整串包含\0复制到 dest覆盖原有内容。char *strcpy(char *dest, const char *src);char *Strcpy(char *dest,const char *src) { char *ret dest; while(*src ! \0) { *dest *src; dest; src; } *dest \0; return ret; }函数首先备份目标字符串 dest 的起始地址至 ret 变量避免后续指针偏移后丢失首地址随后进入循环判断源指针 src 指向内容是否不为结束符 \0若满足条件则将 src 当前字符赋值给 dest 对应位置再同时将两个指针向后自移一位继续拷贝直至读取到源字符串终止符退出循环紧接着在 dest 当前指向位置手动赋值 \0 保证目标字符串格式合法最后返回预先保存的目标数组首地址。strncpy最多拷贝n个字节使用方法和函数原型如下src 长度 ≤ n正常拷贝 带上\0src 长度 n只拷 n 个字符不会自动补 \0char *strncpy(char *dest, const char *src, size_t n);char *Strncpy(char *dest,const char *src,size_t n) { char *ret dest; while(*src ! \0 n0) { *dest *src; dest; src; n--; } while(n) { *dest \0; n--; dest; } return ret; }首先将目标地址 dest 备份到 ret 指针用于最终返回随后进入第一层循环循环条件同时判定源指针未指向字符串结束符且剩余可拷贝长度 n 大于 0满足条件时将源指针当前字符赋值给目标指针对应内存两个指针同步向后偏移一位并将计数 n 减一当源字符串提前结束或拷贝达到指定长度 n 时退出第一层循环接着进入第二层循环对剩余未使用的 n 个字节全部填充赋值为 \0最后返回最初保存的目标数组起始地址。strcat字符串拼接原型如下找到 dest 末尾的\0把 src 追加在后面自动追加新\0。char *strcat(char *dest, const char *src);char *Strcat(char *dest,const char *src) { char * ret dest; while(*dest ! \0) dest; while(*src ! \0) { *dest *src; dest; src; } *dest \0; return ret; }先备份目标字符串起始地址到 ret 指针以便最终返回第一个循环不断向后移动 dest 指针直至找到目标字符串原本的 \0 结束位置随后开启第二个循环将源字符串 src 逐个字符赋值到 dest 当前位置每完成一次赋值就同步递增 dest 与 src 指针直至遍历完源字符串所有有效字符循环结束后在 dest 当前地址手动写入 \0 保证拼接后的字符串合规最后返回最初保存的 dest 首地址方便链接调用。strncat指定字符长度拼接用法和原型如下最多追加 n 个字符一定会在末尾自动补上 \0char *strncat(char *dest, const char *src, size_t n);char *Strncat(char *dest,const char *src,size_t n) { char * ret dest; while(*dest) dest; while(*src n) { *dest *src; dest; src; n--; } *dest \0; return ret; }首先将目标字符串起始地址备份至 ret 指针用于最终返回通过第一个 while 循环持续后移 dest 指针定位到原目标字符串末尾的结束符位置随后进入第二个循环在源字符串未遍历完毕且可追加长度 n 大于 0 的条件下逐个将 src 指向字符赋值给 dest 内存单元同时两个指针同步向后偏移、计数 n 递减当源字符串读取结束或是达到最大追加长度 n 时终止拷贝循环紧接着在 dest 当前指向位置强制写入字符串结束符 \0 确保拼接结果为合法 C 语言字符串最后返回预先保存的目标数组首地址测试结果如下strcmp整串字符串大小比较主要用法如下返回 0两个字符串完全相等返回 0s1 大于 s2返回 0s1 小于 s2。int strcmp(const char *s1, const char *s2);int Strcmp(const char *s1,const char *s2) { while(*s1 *s2 *s1 ! \0 *s2 ! \0) { s1; s2; } return *s1-*s2; }直接接收两个只读字符串指针 s1 和 s2进入循环判定当前两个指针指向字符相等且均未遍历到各自字符串结束符时同步将两个指针向后偏移一位继续对比一旦出现字符不相等或任意一方抵达字符串末尾就退出循环最终返回当前 s1 指向字符 ASCII 值减去 s2 指向字符 ASCII 值的差值返回值为 0 代表两字符串完全一致大于 0 代表 s1 大于 s2小于 0 代表 s1 小于 s2strncmp只比较前 N 个字符int strncmp(const char *s1, const char *s2, size_t n);int Strncmp(const char *s1,const char *s2,size_t n) { while(*s1 *s2 *s1 *s2 n1) { s1; s2; n--; } return *s1-*s2; }接收两个只读字符串指针与无符号长度参数 n循环条件判定当前两指针字符相等、均未到达字符串结束符且剩余可比较次数大于 1 时同步向后移动两个字符指针并递减计数 n不满足任一条件则跳出循环最终返回当前 s1 指向字符与 s2 指向字符的 ASCII 码差值差值为 0 说明指定前缀内容完全相同正数代表 s1 对应位置字符更大负数则代表 s2 更大测试部分结果如下