您的位置:首页 > 其它

glibc中字符串处理的几个函数实现分析

2015-11-26 17:11 435 查看
在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”查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: