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
原创粉丝点击