Linux系统中的str函数

本文介绍了在Linux 3.2.0版本中,如何查找并理解内核定义的str函数。通过`whereis string.h`命令及ctags工具,详细探讨了包括strcmp、strncmp、strcat、strncat、strcpy、strncpy、strspn、strpbrk和strtok在内的多个常用str函数的定义和用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值