字符串函数及内存函数

一、字符串函数

strlen()

strlen()函数是用以计算字符串长度的函数。size_t strlen(const char* string)

  • 返回值是size_t,也就是无符号整形
  • 计算的是字符串中'\0'以前的字符的个数
  • 参数指向的字符串必须以'\0'结尾
  • 模拟实现
size_t my_strlen(const char* string)
{
    assert(string);
    size_t n = 0;
    while (*string++ != '\0')
    {
        n++;
    }
    return n;
}

strcpy()

char *strcpy( char *strDestination, const char *strSource );

该函数的作用是将源字符串'\0'及其以前的字符拷贝到目标空间

  • 源字符串必须以'\0'结束
  • 返回值是目标空间的地址
  • 目标空间必须可以修改
  • 且目标空间要足够大,能够存储源字符串
  • 模拟实现
char* my_strcmp(char* m, const char* source)
{
	assert(source && m);
	char* ret = m;
	while (*m++ = *source++);
	return ret;
}

strcat()

字符串追加:将源字符串'\0'以前的字符拷贝从目标空间的'\0'出开始进行拷贝,并返回目标空间的地址

char *strcat( char *strDestination, const char *strSource );
  • 目标空间必须足够大
  • 目标空间可修改
  • 源字符串必须以'\0'结尾
  • 模拟实现
char* my_strcat(char* m, const char* source)
{
	char* ret = m;
	assert(m && source);
	while (*m++);
	m--;
	while (*m++ = *source++);
	return ret;
}

strcmp()

字符串比较:比较两个字符串

int strcmp( const char *string1, const char *string2 );

  •  模拟实现
int my_strcmp(const char* a, const char* b)
{
	assert(a && b);
	while (*a == *b)
	{
		if (*a == '\0')
			return 0;
		a++;
		b++;
	}
	return *a - *b;
}

 strncpy()

char *strncpy( char *strDest, const char *strSource, size_t count );

当count大于源字符串中的字符时,会在源字符串拷贝到目标空间后,在其后面加'\0'直到达到count个字符

strncat()

char *strncat( char *strDest, const char *strSource, size_t count );

虽然strncat()除了会给目标空间追加count个字符,还会在追加的字符后面加上'\0'

  • 当count大于源字符串的字符数时,不会在其后加'\0'使其追加到count个字符

strncmp()

int strncmp( const char *string1, const char *string2, size_t count );

比较两个字符串的前count个字符的大小

strstr()查找子串

char *strstr( const char *string1, const char *string2 );
  • 能够找到子串则返回string2在string1的起始位置,找不到则返回空指针
  • 模拟实现
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = s1;
	while (*p)
	{
		while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return p;
		p++;
		s2 = str2;
		s1 = p;
	}
	return NULL;
}

strtok()字符串分割

char *strtok( char *str, const char *sep );
  • sep参数是个字符串,定义了用作分隔符的字符集合,例如:
char sep[]="@.*"
  • 参数str表示待分割的字符串,包含0个或者多个sep中的分隔符分隔的标记
  • strtok会改变被操作的字符串,因此一般使用临时拷贝的字符串进行切分
  • strtok函数会找到str中的下一个标记,并将其改成'\0',并返回该字段的起始地址
  • 如果不存在更多的标记,将返回NULL
  • 当str不为NULL,strtok函数在找到下一个标记后,会保存它在字符串中的位置
  • 当str为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标
  • 使用
int main()
{
	char* a = "huangyu@xiong.xieyu*com";
	const char* sep = "@.*";
	char p[30];
	strcpy(p, a);//将数据拷贝一份,处理a数组的内容
	for (char*ret= strtok(p,sep); ret!= NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}
	return 0;
}

strerror()

  • 返回错误码所对应的错误信息的指针
  • errno C语言设置的一个全局的存放错误码的变量,始终会记录最新的错误码,需要使用头文件errno.h
  • 使用:
printf("%s\n",strerror(errno));

二、字符分类函数

头文件ctype.h
函数如果他的参数符合下列条件就返回真(非零值)
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

三、内存函数

memcpy() 内存拷贝

void *memcpy( void *dest, const void *src, size_t count );
  • count表示的是拷贝对象的字节长度(byte)
  • 负责拷贝两块独立空间中的数据,需要头文件 string.h
  • 模拟实现

memmove

实现重叠内存之间的数据拷贝

void *memmove( void *dest, const void *src, size_t count );
  • 同样需要string.h的头文件
  • 模拟实现
void* my_memmove(void* dest, const void* src, size_t n)
{
	assert(dest && src);
	char* ret = dest;
	if (dest > src)
	{
		while (n--)
		{
			*((char*)dest + n) = *((char*)src + n);
		}
	}
	else
	{
		while (n--)
		{
				*((char*)dest)++ = *((char*)src)++;
		}
	}
	return ret;
}

memcmp

内存比较,需要头文件:<memory.h>or <string.h>

int memcmp( const void *buf1, const void *buf2, size_t count );
  • count同样是需要比较元素总共的字节长度
  • 返回值:若buf1大于buf2,则返回>0的数;若buf1小于buf2,则返回<0的数;两个相等,则返回0
  • 使用:
int main()
{
	int a1[] = { 1,2,3,4,5,6 };
	int a2[] = { 1,2,3 };
	printf("%d", memcmp(a1, a2, 12));
	return 0;
}

memset

  • dest为待填充的内存块的指针,c为要填充的值,count为设置为c的字节数
void *memset( void *dest, int c, size_t count );
  •  头文件:<memory.h>or <string.h>
  • 注:在填充过程中,该函数会逐个字节进行填充,也就是每个字节都会填充上c;如下例所示,该函数并不能将数组中每个元素变为1,而是将每个元素的每个字节变为01

  • 使用:这里使用字符是因为字符在传递过程中也是以ascll码值进行传递
int main()
{
	char arr[] = "wanyeweiyuwenhaitang";
	memset(arr, 'x', 5);
	printf("%s\n", arr);
	memset(arr, 'w', 5);
	printf("%s\n", arr);


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值