(超详细)字符函数和字符串函数【上】

前言

C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的,字符串通常放在
常量字符串 中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数 .

1.求字符串长度函数

strlen函数

我们要求一个字符串函数的长度,strlen通常是我们的第一选择,它被包含在string.h头文件中,我们以下要介绍的字符函数和字符串函数都被包含在这个头文件中,这个函数的声明为:

size_t strlen ( const char * str );

为什么它的返回类型是size_t呢,首先我们要知道size_t是无符号整型类型,因为我们字符的长度不可能是负数,所以我们的返回值选择用无符号整型,那么这个函数内部是如何实现的呢?

我们写一段代码演示:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdef";
	size_t sz = strlen(arr);
	printf("%zd\n", sz);
	return 0;
}

我们来看结果:

一个字符串的末尾隐藏着一个\0,strlen就是通过一个一个字符记数,找到\0后就停下然后返回那个记数的值,画图演示:

strlen函数从a开始走,只要没遇到\0就一直往后走,走一个字符记数加一,直到遇到\0时,他就停止向后走,函数工作结束并返回那个记数的值。

注意事项:
1.字符串已经 '\0' 作为结束标志, strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
'\0' )
2. 参数指向的字符串必须要以 '\0' 结束。
3.注意函数的返回值为 size_t ,是无符号的( 易错 )。

总结:strlen函数是一个求字符串长度的函数,内部的工作原理是只要不遇到\0就一直向后走并记数,遇到\0就停下。

2.长度不受限制的字符串函数

strcpy函数

strcpy是用来将一个字符串复制到另一个数组的函数,函数声明为:

char* strcpy(char * destination, const char* sourse)

因为我们要从一个数组中复制字符串到另一个数组中,所以用两个字符指针接收它们的首地址,sourse指向的函数是不需要改变它里面的值的,所以我们用const来修饰它,防止有人改变它的值,增加程序的鲁棒性,在复制完内容后,我们把接收了字符串的那个数组的首地址返回,代码演示:

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

	return 0;
}

我们来看一下结果:

使用strcpy函数,arr1数组中的字符串很轻松就被复制到了arr2数组中,但是函数也有一些注意事项需要遵守,否则会出现一些无法预知的问题 。

注意事项:

1.源数组字符串必须以\0结尾。

2.目标数组空间必须足够大,能够放得下源字符串的内容。

3.目标空间必须可变。

总结:strcpy是一个复制字符串的函数

stract函数

stract函数的功能是将一个字符串复制到另一个字符串的结尾,使得到字符内容的字符串变长,函数声明为:

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

它的函数声明与strcpy函数一样,就不过多介绍了,假设我们要进行这样的操作,用代码演示:

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

代码中表示我们要将arr2数组中的内容放到arr1数组的结尾:

我相信通过代码的演示大家已经了解了strct函数的使用,这里还有使用此函数的一些注意事项。

注意事项: 
1.源字符串必须以 '\0' 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。

strcmp函数

strcmp是字符串比较函数,使用它可以对两个字符串比较,在排序等情况中可以使用此函数,我们来看看这个函数的声明吧:

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

在介绍它的函数声明之前,我们先介绍这个函数的工作原理。我们向strcmp函数放入两个数组的首地址 ,它会对两个字符串的字符进行比较,如果相等就往后比,只要有一位分出大小,就会分出大小,假设我们有一个字符串abcdef和另一个abcq使用strcmp函数进行比较前三位都是abc,所以会往下比,当比到第四位时,是d和q进行比较,c的ascall码为99,q的ascall码为112,当有一位字符比出大小时,就会判定abcq比abcdef大,因为abcdef在前,所以函数判定的结果是小于,返回小于0的数字,如果比到最后,两个字符串都一样,则返回0,如果前面那个字符串比后面那个字符串大,则返回一个大于0的数字。

现在我们再看函数声明,也不难理解这个函数的两个参数是指针,用来接收两个数组的首地址,因为只要比较它们的值,不需要改变它们的值,所以用const修饰。

例如我们要比较两个数组中的字符串,我们用代码演示:

int main()
{
	char arr1[20] = "abcdrf";
	char arr2[] = "abcq";
	int ret=strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

看结果怎么样: 

函数判定abcdef比abcq小,所以返回了一个小于0的数字。

标准规定: 
1.第一个字符串大于第二个字符串,则返回大于 0 的数字
2.第一个字符串等于第二个字符串,则返回 0
3.第一个字符串小于第二个字符串,则返回小于 0 的数字
未完待续。。。。。。

  • 73
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值