Language C:字符串函数的功能和模拟实现

一、字符串相关函数

1.字符分类函数

(1)概念和作用

a.用于字符分类

b.使用前需包含头文件<ctype.h>

c.参数符合条件返回为真

(2)部分函数

isupper( )  、islower( ):检测英文字符的大小写

2.字符转换函数

(1)概念和作用

a.用于转换英文字符的大小写

b.使用前需包含头文件<ctype.h>

c.配合putchar ( )  实现改变原字符(并打印)

(2)使用

#include<stdio.h>
#include<ctype.h>

int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c = toupper(c);
		putchar(c);
		i++;
	}

	return 0;
}

二、字符串函数

1.strlen的使用和模拟实现

(1)使用

strlen(str):获取字符串长度

a.传入的字符串必须以 \0 结尾,并统计 \0 前的字符个数

char str[] = { "abcd" };
char str[] = { 'a','b','c','d','\0' };
//注意不要遗漏第二种写法的\0;

b,.使用需要包含头文件<string.h>

c.该函数的返回值是 size_t 类型

(2)模拟实现

计数器法

size_t my_strlen(const char* s)
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;
	}
	return count;
}

指针相减法

size_t my_strlen(char* s)
{
	char* p = s;
	while (*p != '\0')
	{
		p++;
	}
	return p - s;
}

递归法

size_t my_strlen(char* s)
{
	if (*s == '\0')
		return 0;
	else
		return 1 + my_strlen(s + 1);
}

2. strcpy的使用和模拟实现

(1)使用

strcpy(str1,str2)将arr2的元素复制粘贴至arr1

a.arr1必须是可修改且大于arr2的空间

b.arr2必须以 \0 结尾、

c.\0 也会被一并复制

(2)模拟实现

char* My_strcpy(char* s1,const char* s2)
{
	char* ret = s1;
	while (*s1++ = *s2++)
	{
		;
	}
	return ret;
}

3.strcat的使用和模拟实现

(1)使用

strcat(str1,str2)将 arr2 追加在 arr1 后

a.源字符串和目标字符串以 ‘\0’ 结束

b.目标字符串必须有足够的空间

c.目标字符串可以修改

d.源字符串和目标字符串不能相同

(2)模拟实现

void My_strcat(char* s1, char* s2)
{
	char* spot = s1;
	while (*spot)
	{
		spot++;
	}
	while (*spot++ = *s2++)
	{
		;
	}
	return 0;
}

4.strcmp的使用和模拟实现

(1)使用

strcmp(str1,str2)将arr1与arr2比较(字符的ASCII码值)

a.第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

b.第⼀个字符串等于第⼆个字符串,则返回0

c.第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

(2)模拟实现

int My_strcmp(const char* s1,const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	if (*s1 - *s2 > 0)
		return 1;
	else
		return -1;
}

5.strncpy、strncat、strncmp函数

不同点——在原有的基础上,限制了长度。

(1)strncpy(str1,str2,int)

a.从 str2 中拷贝 n 个字符至 str1 中

b.n 大于 str2 中的元素个数,将追加 0 至达到 n 

(2)strncat(str1,str2,int)

a.将 str2 的前 n 个字符追加至 str1 末尾,再追加一个 \0

b.str2 的长度小于 n 时,会追加 str2 全部内容并补充 \0 ,直到达到 n 

(3)strncmp(str1,str2,int)

限制比较的字符数,最多到第 n 个字符。

6.strstr的使用和模拟实现

(1)使用

strstr(str1,str2):返回 str2 在 str1 中第一次出现的位置(即指针)

a.字符串的比较配对不包含 \0 ,以 \0 作为结束标志

b.不存在时,返回空指针(NULL)

(2)模拟实现

char* My_strstr(const char* str1,const char* str2)
{
	const char* spot = (char*)str1;
	const char* s1 = NULL;
	const char* s2 = NULL;

	if (*str2 == '\0')
		return (char*)str1;

	while (*spot)
	{
		s1 = spot;
		s2 = str2;
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return (char*)spot;
		spot++;
	}
	return NULL;
}

7.strtok的使用和模拟实现

(*)使用

strtok(str1,const str2):根据str2中的元素将str1切割

a.str2是一个包含分割符的字符串

b.str1是一个含有 0 或多个分隔符的字符串

c.strtok函数会找到str1中的下一个分隔符,并用 \0 替换,且返回一个指向此处的指针(此函数会改变原字符串,一般将目标字符串临时拷贝一份作为str1)

d.str1不为 NULL,函数将找到str1中的第一个分隔符,并保存它在 str1 中的位置;str1为 NULL,函数将从上次保存的位置开始寻找下一个分隔符

e.不存在更多的分隔符,将返回 NULL

使用举例(一般配合 for循环使用)

char str[] = { "A111B222C333D444" };
char* p = { "ABCD" };
char* s = NULL;
for (s = strtok(str, p); s != NULL; s = strtok(NULL, p))
{
	printf("%s\n", s);
}

8.strerror的使用和模拟实现

(*)使用

strerror( int ):传入一个错误码,返回错误对应的字符串地址

a.使用前声明头文件 <string.h>

b.使用错误码需声明头文件<errno.h>

使用举例

int main()
{
 int i = 0;
 for (i = 0; i <= 10; i++) 
 {
 printf("%s\n", strerror(i));
 }
 return 0;
}

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值