字符与字符串函数

目录

strlen()

断言assert(arr)

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

strcpy(arr1,arr2)

strcat(arr1,arr2)

strcmp(arr1,arr2)

长度不受限制和长度受限制的理解

长度受限制的字符串函数

strncpy

strncat

strncmp

字符串查找

strstr(arr1,arr2)

strtok(str,sep)

错误信息报告

strerror (errnum)

函数perror

字符分类函数

字符转换函数

int tolower ( int c );

int toupper ( int c ); 



strlen()

计算字符串长度(字符元素个数)

strlen()从字符串的开头位置依次往后面计数,直到遇到‘\0’停止,所计算的字符串大小为‘\0’以前的字符所计算的值,最终的字符串长度不包括‘\0’

调用strlen()需要引用的头文件是<string.h>,它的原型是size_t strlen(const char* str);str表示的是需要计算长度的字符串,由此看出传参的时候应该传的是一个地址而不是一个数值。


断言assert(arr)

检查指针是否合法

检查arr指针是否合法。

使用断言的时候需要引用头文件assert.h.

断言一个指针:

assert(arr)

断言两个指针:

assert(arr1 && arr2)


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

strcpy(arr1,arr2)

拷贝字符串

完整定义为:char *strcpy( char str Destination, const char strSource );

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

复制字符串,将源指向的C字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)。

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

这个函数接受两个参数:一个目标字符串(dest)和一个源字符串(src)。

        它首先将目标字符串(dest)的第一个字符设置为源字符串(src)的第一个字符,然后逐个复制源字符串中的字符到目标字符串中,直到遇到源字符串的结束符。

        这个过程是通过指针进行的。`strcpy`函数首先将目标字符串(dest)的地址赋给一个指针变量(通常是`*dest`),然后通过这个指针变量逐个复制源字符串中的字符到目标字符串中。当复制到目标字符串的末尾时,`strcpy`函数会检查是否已经复制到了目标字符串的结束符,如果是,那么它会将结束符添加到目标字符串的末尾。

        需要注意的是,`strcpy`函数不会检查目标字符串是否有足够的空间来存储源字符串,这可能会导致缓冲区溢出,进而引发安全问题。因此,在使用`strcpy`时,必须确保目标字符串有足够的空间来存储源字符串,或者使用其他安全的方法来复制字符串。

strcpy返回值为目标字符串的指针。

模拟实现strcpy

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

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

int main()
{
	char a1[100] = "hello";
	char a2[100] = " world!";
	my_strcpy(a1, a2);
	printf("%s", a1);
	return 0;
}

strcat(arr1,arr2)

追加字符串

在arr1后面追加arr2。

追加过程:

`strcat`是一个常用的C语言函数,用于连接两个字符串。其基本原理是:

        1. **内存分配**:`strcat`首先会检查目标字符串的缓冲区是否有足够的空间来存放源字符串。如果没有,它将引发错误或导致缓冲区溢出,这是一种常见的安全问题。
        2. **源字符串复制**:如果源字符串和目标字符串的缓冲区都足够,`strcat`会复制源字符串到目标字符串的末尾,并在目标字符串的末尾添加一个空字符('\0'),以表示字符串的结束。
        3. **添加终止字符**:`strcat`会遍历源字符串,直到找到空字符('\0'),并将其添加到目标字符串的末尾。这个空字符标记了源字符串的结束,也是目标字符串扩展后的结束位置。

        总的来说,`strcat`的工作原理是先将源字符串复制到目标字符串的末尾,然后在末尾添加一个空字符来标记字符串的结束。注意,如果目标缓冲区太小,可能会发生溢出,这是需要避免的情况。

模拟实现strcat

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

char* my_strcat(char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	//找'\0'
	int a = 1;
	char* ret = arr1;
	while (*arr1++)
	{
		a++;
	}
	//追加
	arr1--;
	while (*arr2)
	{
		*arr1++ = *arr2++;
	}
	return ret;
};

int main()
{
	char a1[100] = "hello";
	char a2[100] = " world!";
	my_strcat(a1, a2);
	printf("%s", a1);
	return 0;
}

使用strcat时,自己给自己追加会导致陷入追加的循环。


strcmp(arr1,arr2)

比较字符串

用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),

若str1>str2,则返回正数。

若str1=str2,则返回零;

若str1<str2,则返回负数;

(比较规则是:相同下标的字符相比,比较ASCII值大小)

比较两个字符串比较C字符串str1和C字符串str2。这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续处理后面的字符对,直到字符不同或到达终止空字符为止。这个函数执行字符的二进制比较。


长度不受限制和长度受限制的理解

长度不受限制,指的是:

strcpy:copy至\0
strcpy:追加至\0
strcmp:比较至\0
长度不受限制指的是:到\0的长度不受限制

长度不受限制可能会有危险,因为长度不受限制时,目标空间不够的情况下还进行操作,会有危险。

没有提前声明时,即使是标准的
strcpy
strcat
strcmp
也会报错,编译器也会提示函数是危险的函数。


长度受限制的字符串函数

strncpy

strncpy,比strcpy多了一个参数n,n的意义是拷贝的字符个数。不过,拷贝了字符后,整个字符串后面不会自动加\0。

也就是说,整个拷贝后的结果,不会有\0。因为拷贝函数中,\0是拷贝停止条件,而不是拷贝内容。

机制:

  1. 在每一次拷贝时,n都会减一,n一直到0时,才会停止拷贝。
  2. 如果没有拷贝的内容,即源字符串长度不够,则每一次拷贝的内容是\0。
  3. 也就是说,整个拷贝后的结果,不会有\0。因为拷贝函数中,\0是拷贝停止条件,而不是拷贝内容。
  4. n一直到0时,才会停止拷贝。
  5. 如果没有拷贝的内容,即源字符串长度不够,则每一次拷贝的内容是\0。

strncat

strncat,比strcat多了一个参数n来限制追加的字符个数。

n代表追加n个源字符串中的字符。


strncmp

strncmp,比strcmp多了一个参数n,n代表的是比较的字符个数。

不过,由于该函数的比较机制,可能比较不到n个字符,函数就已经结束比较并返回结果了。


字符串查找

strstr(arr1,arr2)

字符串查找函数strstr

判断是否为子集

strstr是一个标准库函数。

判断arr2是否为arr1的子集。

70e59b334ce646bf8840fd72fe94741f.png

查找时,有两种情况(简单和复杂)

第二种情况,体现出strstr的查找机制。

关于返回值:
如果可以找到,返回第一次出现的位置。
不过不能找到,返回


strtok(str,sep)

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


 

  1. ep参数是个字符串,定义了用作分隔符的字符集合。
  2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  3. strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
  4. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  5. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  6. 如果字符串中不存在更多的标记,则返回 NULL 指针。

第一次使用的时候要传一个数组和标记字符集。

第二次使用,传null和标记字符集。

strtok函数每次在消除特殊字符时,会记录每次消除的特殊字符的位置以便下一次strtok函数的使用。

当strtok函数找不到特殊字符时,将会返回空指针NULL。

strtok函数在运行时会创建一个静态变量以保存下一次的切割位置。(静态变量创建后不销毁)

正常使用的strtok并不是一个一个拿出来的,而是使用for循环来进行切割操作。


错误信息报告

strerror (errnum)

char * strerror( int errnum );

C语言的库函数在运行的时候,如果发出错误,就会将错误代码存在一个变量中(全局变量),这个变量是errno

错误码是一些数字。

我们需要将错误码翻译成错误信息。

每一个错误码,都对应着一串错误信息。

使用strerror(),用完后会返回一个指针。

这个指针是那条错误信息的首次母指针。 

使用strerror()函数时,要引用头文件是string.h。

当使用errono时,需要引用errno.h文件


函数perror

perror也可以打印错误信息。

perror=printf+strerror

perror函数,perror是直接打印错误信息。

但是!!!

在打印错误信息之前,会先打印自定义的信息。

(怎么说呢,就是如果我们自己有打印的内容,那控制台上就会先打印我们自己的内容,再打印错误信息。)

使用perror的头文件是:stdio.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任何可打印字符,包括图形字符和空白字符


字符转换函数

这两个函数的参数,也可以是字符。因为传参传的是ASCII码值。

int tolower ( int c );

大写字母转小写

int toupper ( int c ); 

小写字母转大写

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值