我的Linux内核版本为
linux@ubuntu:~$ cat /proc/version
Linux version 3.2.0-29-generic-pae (buildd@roseapple) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012
在Linux系统中找到内核中所定义的str函数,在vim编译器中经常用到#include <string.h>
回到家目录中,使用命令whereis string.h,利用ctags(vim编辑器下为阅读代码带来便利的工具);找到string.h中函数的定义;
查看了他们的定义之后,拷贝出内核中所写的一部分常用的str函数定义;
1、 strcmp
#ifdef _HAVE_ARCH_STRCMP
int strcmp(const char *cs,const char *ct)
{
register signed char _res;
while(1)
{
if((_res = *cs - *ct++) != 0 || !cs++)
break;
}
return _res;
}
#endif
2、 strncmp
#ifndef _HAVE_ARCH_STRNCMP
int strcnmp(const char *cs,const char *ct,size_t count)
{
register signed char _res = 0;
while(count)
{
if((_res = *cs - *ct++) != 0)|| !*cs++)
break;
count--;
}
return _res;
}
#endif
3、 strcat
#idndef _HAVE_ARCH_STRCAT
char *strcat(char *dest,const char *src)
{
char *tmp = dest;
while(*dest)
dest++;
while((*dest++ = *src++) != '\0');
return tmp;
}
#endif
4、 strncat
#ifndef _HAVE_ARCH_STRNCAT
char *strncat(char *dest,const char *src,size_t count)
{
char *tmp = dest;
if(count)
{
while(*dest)
dest++;
while(*dest++ = *src++)
{
if(--count == 0)
{
*dest = '\0';
break;
}
}
}
return tmp;
}
#endif
5、 strcpy
#ifdef _HAVE_ARCH_STRCPY
char *strcpy(char *dest,const char *src)
{
char *tmp = dest;
while((*dest++ = *src++)!= '\0')
/*nothing*/;
return tmp;
}
#endif
6、 strncpy
#ifndef _HAVE_ARCH_STRNCPY
char *strcnpy(char *dest,const char *src,size_t count)
{
char *tmp = dest;
while(count-- &&(*dest++ = *src++) != '\0')
/*nothing*/
return tmp;
}
#endif
7、 strspn
#ifndef _HAVE_ARCH_STRSPN
size_t strspn(const char* s,const char *accept)
{
const char *p;
const char *a;
size_t count = 0;
for(p = s;*p != '\0';++p)
{
for(a = accept;*a != '\0';++a)
{
if(*p == *a)
break;
}
if(*a == '\0')
return count;
++count;
}
return count;
}
#endif
8、 strpbrk
#ifndef _HAVE_ARCH_STRPBRK
char *strpbrk(const char *cs,const char *ct)
{
const char *sc1,*sc2;
for(sc1 = cs;*sc1 != '\0';++sc1)
{
for(sc2 = ct;*sc2 != '\0';++sc2)
{
if(*sc1 == *sc2)
return(char *) sc1;
}
}
return NULL;
}
#endif
9、 strtok
#ifndef _HAVE_ARCH_STRTOK
char *strtok(char *s,const char *ct)
{
char *sbegin,*send;
sbegin = s ? s:_strtok;
if(!sbegin)
{
return NULL;
}
sbegin += strspn(sbegin,ct);
if(*sbegin == '\0')
{
_strtok = NULL;
return(NULL);
}
send = strpbrk(sbegin,ct);
if(send && *send != '\0')
*send++ = '\0';
_strtok = send;
return (sbegin);
}
endif