字符函数和字符串函数

目录

1.字符函数

1.1字符分类函数

1.2字符转换函数

2.字符串函数

2.1strlen函数

2.2strcpy函数

2.3strcat函数

2.4strcmp函数

2.5strncpy函数

2.6strncat函数

2.7strncmp函数

2.8strstr函数

2.9strtok函数

2.10strerror函数


 

1.字符函数

1.1字符分类函数

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

使用这些函数都需要一个头文件<ctype.h>。

1.2字符转换函数

int tolower(int c);//将参数传进去的大写字母转为小写
int toupper(int c);//将参数传进去的小写字母转为大写

2.字符串函数

<assert.h>头文件定义了宏assert( ),在运行时可以确保程序符合指定的条件,如果不符合条件,就会报错终止运行。(缺点是加入了额外的检查,增加了程序运行的时间)

2.1strlen函数

size_t strlen(count char* str);

1.返回字符串str的长度,函数的返回值是size_t(无符号);

2.字符串的长度由终止字符NULL决定,字符串的长度等于字符串开头和终止字符NULL之间的字符数(不包括NULL本身);

3.使用需包括头文件<string.h>。

模拟实现

方法一:

//不能创建临时变量计数器
int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

方法二:

//计数器
int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		*str++;
	}
	return count;
}

方法三:

//指针-指针
int my_strlen(const char* str)
{
	assert(str);
	char* p = str;
	while (*p != '\0')
	{
		*p++;
	}
	return p - str;
}

2.2strcpy函数

char* strcpy(char* destination,const char* source);

 1.将source指向的字符串复制到destination指向的数组中(把源头的数据拷贝到目的地的空间),包括终止字符NULL并在该点停止;

2.会将源字符串中的'\0'拷贝到目标空间;

3.为了避免溢出,destination指向的数组的大小应足够大,以包含与source相同的字符串(包括终止字符NULL),并且不应在内存中与source重叠;

4.目标空间必须可以修改;

5.使用需包括头文件<string.h>。

模拟实现

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
		;
	return ret;
}

2.3strcat函数

char* strcat(char* destination,const char* source);

1. 将源字符串的副本追加到目标字符串中,destination中的终止字符NULL将被source的第一个字符覆盖,并且NULL包含在destination中形成新字符串的末尾;

2.destination和source不能重叠;

3.目标字符串中也需要有'\0',否则不知道追加从哪开始(找到目标空间末尾的'\0');

4.目标空间需要足够大,能容纳源字符串的内容;

5.目标空间必须可以修改;

6.使用需包括头文件<string.h>。

模拟实现

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
		;
	return ret;
}

2.4strcmp函数

int strcmp(const char* str1, const char* str2);

1.将字符串str1与字符串str2进行比较;

2.此函数开始比较每个字符串的第一个字符,如果它们彼此相等,则继续往下处理,直到字符不同或者遇到终止字符NULL;

3.比较两个字符串中对应位置上的字符ASCLL码值大小;

4.使用需包括头文件<string.h>。

返回值表明
>0第一个字符串大于第二个字符串
0第一个字符串等于第二个字符串
<0第一个字符串小于第二个字符串

模拟实现

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}

 最后也可以写为

return *str1-*str2;

2.5strncpy函数

char* strncpy(char* destination, const char* source, size_t num);

1. 从源字符串拷贝num个字符到目标空间;

2.如果在复制num个字符之前找到源字符串的末尾(由NULL表示),就是源字符串的长度小于num,则拷贝完源字符串之后,在目标后面填充0,直到写入总数num个字符为止(多了后面的字节数,需要拷贝多少就拷贝多少,没有内容就用'\0'补充);

3.如果source长于num,则不会在destination的末尾附加NULL,因此在这种情况下,destination不应被视为不应被视为以NULL结尾的字符串(所以读取它会溢出);

4.destination和source不应重叠;

5.使用需包括头文件<string.h>。

2.6strncat函数

char* strncat(char* destination, const char* source, size_t num);

1.将source指向的字符串的前num个字符追加到destination指向的字符串末尾,在追加一个'\0';

2.如果source指向的字符串长度小于num时,只会将字符串中到'\0'的内容追加到destination指向的字符串末尾;

3.末尾的'\0'是补上的,作为结束的标志;

4.使用需包括头文件<string.h>。 

2.7strncmp函数

int strncmp(const char* str1, const char* str2, size_t num);

1.比较str1和str2的前num个字符;

2.如果相等就继续往后比较,最多比较num个字符,如果提前发现不一样,就会提前结束;

3.如果num个字符都相等,就返回0;

 4.使用需包括头文件<string.h>。

2.8strstr函数

char* strstr(const char* str1, const char* str2);

1.查找子串,通过一个字符串来找另一个字符串; 

2.返回指向str1中第一次出现的str2的指针,如果str2不是str1的一部分,则返回NULL指针;

3.字符串的匹配不包含'\0',以'\0'作为结束标志;

4.使用需包括头文件<string.h>。

查找的过程中会出现两种情况:

情况一:匹配一次就能找到;

情况二:匹配多次才能找到,多次匹配开始匹配的时候需要记住可能匹配成功的位置,如果匹配不成功指向str1的指针就挪到可能匹配成功的下一位(因为第一次匹配的位置已经没有意义),指向str2的指针就挪到第一位开始重新匹配。

模拟实现

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;
	while (*p)
	{
		s1 = p;//进入循环后开始赋值
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//要是两个字符串等于'\0'了,就不能往后走了
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')//说明这个字符串找到了,需要拦截一下,然后返回起始位置
		{
			return p;
		}
		p++;
	}
	return NULL;//找不到返回空指针
}

2.9strtok函数

char* strtok(char* str,const char* delimiters);

1. 切割字符串,delimiters指向一个字符串,定义了用作分隔符的字符集合;

2.在第一次调用时,该函数需要一个字符串作为str的参数,其第一个字符用作扫描标记的起始位置;在后续的调用中,该函数需要一个NULL指针,并使用最后一个标记结束后的位置作为扫描的新起始位置;

3.如果strtok函数的第一个参数为NULL,函数将在同一个字符串中保存的位置开始,查找下一个标记;如果第一个参数不为NULL,函数将找到str中的第一个标记,函数将保存它在字符串中的位置;

4.如果字符串中没有更多标记,则返回空指针;

5.使用需包括头文件<string.h>。

2.10strerror函数

 char* strerror(int errnum);

 1.获取指向错误消息字符串的指针,生成一个字符串,其中包含一条描述错误条件的消息;

2.返回的指针指向静态分配的字符串,该程序不能修改字符串;

3.对此函数的进一步调用可能会覆盖其内容(不需要特定的库实现来避免数据竞争);

4.C语言的库函数,在执行失败时都会设置错误码,在不同的系统和C语言标准库的实现中都规定了一些错误码(都有对应的错误信息),一般会放在<errno.h>这个头文件中说明,errno是C语言设置的一个全局的错误码存放的变量;

5.使用需包括头文件<string.h>。

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值