十一. C语言字符、字符串函数详解(1)

前言:大家好!好久不见,临近寒假,身边的事越来越多,但是,再忙也不能停止学习!

在编程过程中,我们经常处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数

接下来进入这一章:字符 、字符串函数 

1.字符分类函数

字符分类函数是专门为字符分类的,也就是一个字符是属于什么类型的字符

这些函数的使用都需要包含一个头文件: ctype.h

这些函数的语法非常相似,我拿一个举例

islower 判断参数部分  c 是否是小写字母

如果是小写字母返回非0整数,如果不是小写字母,则返回0

下面是将字符串中的小写字母转大写,其它字符不变


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

int main()
{
	int i = 0;
	char str[] = "Love.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c -= 32;//ASCLL码,大写小写对应的字符相差32
		putchar(c);//putchar可以直接打印字符c的内容
		i++;
	}
	return 0;
}

2.字符转换函数

基于上面的函数,C语言提供的字符转换函数可以直接完成类似 +-32 (ascll码)的效果

直接用tolower函数完成小写转大写

#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Love\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c = toupper(c);
		putchar(c);
		i++;
	}
	return 0;
}

3.strlen的使用和模拟实现

语法:

——  计算字符串长度,从第一个字符开始计算,遇到 \0 停下,不包括 \0

——  需要包含头文件 <string.h>

—— 返回值为无符号整型(size.t)  → 当程序运行结果为负数时,最终输出为其绝对值

使用:

#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";//a b c d e f \0
	const char* str2 = "bbb";// b b b \0
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

模拟实现:

方法一(计数器):

int my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while (*str)//*str等同于*str!=\0
	{
		count++;
		str++;
		//char类型每次操作四个字节
	}
	return count;
}

方法二(函数递归):

int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

方法三(指针-指针):


int my_strlen(char *s)
{
 assert(str);
 char *p = s;
 while(*p != ‘\0’ )
 p++;
 return p-s;
}

4.strcpy的使用和模拟实现

语法:

——字符串拷贝,源字符串必须以 \0 结束,并将源字符串的 \0 拷贝到目标空间

——目标空间必须足够大,确保能放下源字符串

——目标空间必须可修改

——需要包含头文件 <string.h>

使用:

#include <stdio.h>
#include <sting.h>

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "love";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

模拟实现:

#include <stdio.h>
#include <sting.h>
#include <assert.h>
char* my_strcpy(char* dest, char* src)
{
    char*ret=dest;
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//这一步把最后的 \0 拷贝过去
    return ret;
}
//优化函数
char* my_strcpy(char* dest, char* src)
{
    char*ret=dest;
	assert(dest&&src );
	//assset 中只要为假就报错
	while (*dest++ = *src++)
		//当赋值到\0时,程序停止,\0的ascll值为0,0为假,到0循环停止
	{
		;
	}
    return ret;
}

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "love";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

5.strtcat的使用和模拟实现

语法:

——追加一个字符串

——源字符串和目标字符串必须以\0结尾(或有 \0)

——目标字符串必须可以修改,且足够大

——自己给自己追加不安全,谨慎使用,尽量不使用

——需要包含头文件<string.h>

使用:

#include <string.h>
int main()
{
	char arr1[20] = "love ";
	char arr2[] = "you";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return  0;
}

模拟实现:


#include <string.h>
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
   	assert(dest && src);
	//找到目标空间的\0,以使拷贝时能从\0处拷贝
		while (*dest)
		{
			dest++;
		}
		while (*dest++ = *src++)
		{
			;
		}
		return ret;
}

int main()
{
	char arr1[20] = "love ";
	char arr2[] = "you";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return  0;
}

6.strcmp的使用和实现

语法:

——比较字符串上对应位置的字符大小

——比较的不是字符串的长度,但反应的是字符串的比较结果

——第一个字符串大于第二个字符串,则返回大于0的数字

——第一个字符串等于第二个字符串,则返回0

——第一个字符串小于第二个字符串,则返回小于0的数字

——本质是比较两个字符串中对应位置上字符ASCII码值的大小

使用:

模拟实现:

#include <string.h>
#include <stdio.h>
#include <assert.h>

int my_strcmp(const char*s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)
		//如果对应位置相等,则进行下一位的判断
	{
		if (*s1 == '\0')
		{
			return 0;//如果进行到最后一位还相等,则返回0,表示相等
		}
		s1++;
		s2++;
	}
	if (*s1 > *s2)
		return 1;
	else
		return -1;
}

int main()
{
	int ret = my_strcmp("love", "love");
	printf("%d\n", ret);
	return 0;
}

总结:字符串函数第一篇结束,共两篇,请耐心等待下一篇哦!

作者留言:本人初学者,创作不易,如有错误或不恰当的地方,欢迎指出!

创作时间:2024.1.19 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值