glibc中字符串处理的几个函数实现分析
来源:互联网 发布:淘宝网人工客服热线 编辑:程序博客网 时间:2024/04/30 11:14
在C语言中,我们经常会用到字符串处理的几个函数,如strcat、strcmp、strcpy等,那么这些函数是怎么实现的呢?
strcat——
char* strcat(char *dest, const char *src);
字符串拼接,把src追加到dest后面。
测试用例:
#include <stdio.h> #include <string.h> int main() { char arr[20] = "apple"; const char *p = "pear"; char *p2 = strcat(arr, p); printf("arr=%s,p=%s,p2=%s\n", arr, p, p2);//arr=applepear,p=pear,p2=applepear return 0; }
函数实现:
char* strcat(char *dest, const char *src) { char *s1 = dest; const char *s2 = src; char c; /* Find the end of the string. */ do c = *s1++; while (c != '\0'); /* Make S1 point before the next character, so we can increment it while memory is read (wins on pipelined cpus). */ s1 -= 2; do { c = *s2++; *++s1 = c; } while (c != '\0'); return dest; }
strcmp——
int strcmp(const char *s1, const char *s2);
字符串比较,逐个比较s1和s2对应位置的字符。
测试用例:
#include <stdio.h>#include <string.h>int main(){ const char *pc = "abc"; const char *pc2 = "abcdefg"; const char *pc3 = "abc"; printf("d:%d\n", 'd'); printf("strcmp(pc, pc2):%d\n", strcmp(pc, pc2)); printf("strcmp(pc2, pc):%d\n", strcmp(pc2, pc)); printf("strcmp(pc, pc3):%d\n", strcmp(pc, pc3)); //d:100 //strcmp(pc, pc2):-100 //strcmp(pc2, pc):100 //strcmp(pc, pc3):0 return 0;}
函数实现:
int strcmp (const char *p1, const char *p2) { const unsigned char *s1 = (const unsigned char*)p1; const unsigned char *s2 = (const unsigned char*)p2; unsigned char c1, c2; do { c1 = (unsigned char)*s1++; c2 = (unsigned char)*s2++; if (c1 == '\0')//如果c1 == '\0', 字符串末尾, 比较结束. return c1 - c2; } while (c1 == c2);//如果c2 == '\0' && c1 != '\0',比较也会结束. return c1 - c2; }
strncat——
char *strncat(char *dest, const char *src, size_t n);
字符串拼接,把src追加到dest后面,最多追加n个字符。
测试用例:
#include <stdio.h> #include <string.h> int main() { char a[10] = "apple"; const char *pt = "pear"; char *pt2= strncat(a, pt, 2); printf("a=%s,pt=%s,pt2=%s\n", a, pt, pt2);//a=applepe,pt=pear,pt2=applepe return 0; }
函数实现:
char* strncat(char *s1, const char *s2, size_t n) { char c; char *s = s1; do c = *s1++; while (c != '\0'); s1 -= 2; /* 上面的处理同strcat, 把指针移动到合适的位置, 等待字符串的追加 */ /* 当n >= 4时, n右移两位, 即除以4, 这样效率更高. */ if (n >= 4) { size_t n4 = n >> 2; do { c = *s2++; *++s1 = c; if (c == '\0') return s; c = *s2++; *++s1 = c; if (c == '\0') return s; c = *s2++; *++s1 = c; if (c == '\0') return s; c = *s2++; *++s1 = c; if (c == '\0') return s; } while (--n4 > 0); n &= 3;/* 相当于取n/4的余数, 位操作符的效率比+、-要高,比*、/更高. */ } while (n > 0) { c = *s2++; *++s1 = c; if (c == '\0') return s; n--; } if (c != '\0') *++s1 = '\0'; return s; }
除了上面提到的几个函数之外,string.h/strings.h还提供了大量的字符串处理函数,可以在linux shell中“man 3 string”查看。
1 0
- glibc中字符串处理的几个函数实现分析
- glibc中几个数值处理函数
- glibc中几个有用的处理二进制们的内置函数
- glibc的几个有用的处理二进制位的内置函数
- glibc的几个有用的处理二进制位的内置函数
- glibc的几个有用的处理二进制位的内置函数
- glibc的几个有用的处理二进制位的内置函数
- glibc的几个有用的处理二进制位的内置函数
- glibc的几个有用的处理二进制位的内置函数
- glibc的几个有用的处理二进制位的内置函数
- glibc的几个有用的处理二进制位的内置函数
- 几个常见字符串处理函数的实现原理
- glibc中strcpy,strcat,strcmp,memcpy等函数的实现和分析
- glibc中socket实现分析
- C语言中常用的几个字符串处理函数:
- 几个字符串函数的实现
- 几个字符串函数的实现
- 几个非常有用的字符串处理函数!
- 秒杀多线程第七篇---经典线程同步 互斥量Mutex
- 天嵌E9卡片i.mx6q-Linux12.04搭建nfs环境以及从nfs启动开发板
- 完美解决php验证码session不同步的问题
- JavaSE(07)(数组高级操作及日期格式)
- MVC Html.AntiForgeryToken() 防止CSRF攻击
- glibc中字符串处理的几个函数实现分析
- Java——与 或 非 异或
- 设计模式初体验——工厂模式
- ubuntu——apt源镜像
- ASP.NET根据URL生成网页缩略图示例程序(C#语言)
- linux下查看进程内存使用情况
- web进门第13天
- C和指针2.2
- 关于java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible