C语言——字符函数与字符串函数

C语言------字符函数和字符串函数

一.字符分类函数

1.功能:

专门做字符分类的函数,也就是判断字符属于什么类型,这些函数都需要包含一个头文件从**ctype.h**

函数 如果它的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格'',换页'\f',回车'\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 任何可打印字符,包括图形字符和空白符

2.字符分类函数的应用

写一个代码,将字符串中的小写字母转为大写,其他字符不变

c 复制代码
#include<stdio.h>
#include<ctype.h>
int main()
{
	char arr[] = "I love CSDN.";
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))
			arr[i] -= 32;//小写字母转大写
		printf("%c", arr[i]);
		i++;
	}
	return 0;
}

运行:

二.字符转换函数

1.功能

该函数适用于大小写字母的转换

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

2.应用

c 复制代码
#include<stdio.h>
#include<ctype.h>
int main()
{
	int r = toupper('a');
	printf("%c\n", r);
	return 0;
}

三.strlen函数

基本实现

  1. 在之前的笔记有提到过strlen函数,其基本形式:
c 复制代码
size_t strlen (const char* str)
  1. 功能:统计参数str指向的字符串的长度。统计的是字符串中'\0'之前的字符的个数,若是没有'\0',返回的可能就是一个随机值
  2. 参数:str:指针,指向了要统计长度的字符串
  3. 返回值:返回了str指向的字符串的长度,返回的长度不会是负数,所以返回类型是size_t(无符号整型)
  4. 使用
  • 举例一
c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	size_t len=strlen("abcdef");
	printf("%zu\n",len);
	return 0;
}
  • 举例二
c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	if (strlen("abcd") - strlen("abcdefg") > 0)
	//4                 7
	{
		printf(">\n");
	}
	else
	{
		printf("<=\n");
	}
	return 0;
}
  • 注意这里,strlen("abcd")和strlen("abcdefg")算出的结果返回类型都是size_t(无符号整型),故而它们相减的结果也会被认为是size_t类型的,所以计算结果不是-3而是3,因而结果是>
  • 例如-3,因为系统认为是无符号整型,所以会把它的补码当作源码来对待,如:
    -3的原码:10000000000000000000000000000011
    -3的反码:11111111111111111111111111111100
    -3的补码:11111111111111111111111111111101
    它的补码就是一个非常大的正数

strlen函数的模拟实现

不创建临时变量,求字符串长度

c 复制代码
#include<stdio.h>
#include<string.h>
size_t my_strlen(const char* str)//这里通过传参str得到数组首元素的地址
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);//函数递归
	else
		return 0;
}
int main()
{
	char arr[] = "abc";
	size_t len = my_strlen(arr);
	printf("%zu\n", len);
	return 0;
}

四.strcpy字符串拷贝函数

基本实现

  1. 代码块:
c 复制代码
char* strcpy(char* destination,const char* source)
  1. 功能:字符串拷贝,拷贝到源头字符传中的\0位置
  2. 参数:destination:指针,指向目的地空间
    source:指针,指向源头数据
  3. 返回值:strcpy函数返回的目标空间的起始地址
  4. 使用:
  • 举例:
c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "hello word";
	char arr2[20] = { 0 };
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	//写法二:
	/*char* ret=strcpy(arr2, arr1);
	printf("%s\n", ret);*/
	return 0;
}

注意数组名是地址,地址是一个编号,地址是常量值不能被修改,地址指向空间,但地址不是空间

使用注意事项:

  • 源字符串必须以'\0'结束;
  • 会将源字符串中的'\0'拷贝到目标空间
  • 目标空间必须足够大,以确保能存放源字符串
  • 目标空间必须修改

strcpy函数的模拟实现

c 复制代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);//断言一下,dest和src都不能为空指针
	while (*dest++ = *src++)//既能完成\0前字符的拷贝也能完成\0的拷贝
	{
		;
	}
	return ret;//返回目标空间的起始地址
}
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = "xxxxxxxxxxxxxxxxx";
	char* r= my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	printf("%s\n", r);
	return 0;
}

五.strcat字符串拼接函数

基本使用

c 复制代码
char* strcat(char* destination,const char* source);
  1. 功能:字符串拼接,把source指向的源字符串都拼接到destination指向的空间中
  2. 返回值:strcat函数返回的目标空间的起始地址
  3. 使用:
  • 示例:
c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcat函数的模拟实现

模拟思想是先找到目标空间的字符串末尾(\0);然后从\0的位置开始向后追加

c 复制代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//找目标空间的\0
	while (*dest != '\0')
		dest++;
	//拷贝
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char arr1[20] = "hello\0xxxxxxxxx";
	char arr2[] = "world";
	char* r = my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", r);
	return 0;
}

六.strcmp字符串比较函数

基本使用

c 复制代码
int strcmp(const char*str1,const char* str2);
  1. 功能:比较str1和str2指向的字符串,从两个字符串的第一个字符开始比较,如果两个字符的ASCII码值相等就比较下一个字符。直到遇到不相等的字符,或者字符串结束
  2. 返回值(标准规定):
  • 第一个字符串大于第二个字符串,返回大于0的数字
  • 第一个字符串等于第二个字符串,返回0
  • 第一个字符串小于第二个字符串,返回小于0的数字
  1. 举例:
c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int r = strcmp(arr1, arr2);
	if (r > 0)
		printf("arr1>arr2\n");
	else if(r<0)
		printf("arr1<arr2\n");
	else
		printf("arr1=arr2\n");
	return 0;
}

strcmp函数的模拟实现

c 复制代码
#include<stdio.h>
#include<assert.h>
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;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int r = my_strcmp(arr1, arr2);
	if (r > 0)
		printf("arr1>arr2\n");
	else if (r < 0)
		printf("arr1<arr2\n");
	else
		printf("arr1=arr2\n");
	return 0;
}

七.strncpy函数

之前学过的strcpy,strcat,strcmp函数均是长度不受限制的字符串函数

而后面要学到的strncpy,strncat,strncmp函数均是长度受限制的字符串函数

基本使用:

  1. 使用格式:
c 复制代码
char* strncpy(char* destination,const char* source,size_t num);
  1. 功能:
    字符串拷贝 ,将source指向的字符串拷贝到destination指向的空间中,最多拷贝num个字符
  2. 举例:
  3. 注意:strcpy函数拷贝到\0为止,若目标空间不够,易出现越界;而strncpy函数指定了拷贝长度,源字符串不一定需要有\0,所以该函数相比来说更安全一些。

八.strncat函数

基本使用

  1. 代码格式:
c 复制代码
char* strcat(char* destination,const char* source);
  1. 功能:字符串追加,将source指向的字符串内容,追加到destination指向的空间,最多追加num个字符
  2. 举例:
  3. 注意:strcat函数拼接时需将源字符串全部包括\0都包含,但是strncat函数指定了追加的长度,所以源字符串不一定有\0。

九.strncmp函数

基本使用

1.代码格式:

c 复制代码
int strncmp(const char* str1,const char* str2);
  1. 功能:字符串比较,比较str1和str2指向的两个字符串的内容,最多比较num字符
  2. 举例:
  3. 注意:返回值规则与strcmp函数基本相似,但是strncmp可以比较任意长度的字符串

十.strstr函数

基本使用

c 复制代码
char* strstr(const char* str1,const char* strs);
  1. 功能:查找str2指向的字符串在str1指向的字符串中第一次出现的位置
  2. 返回值:如果str1指向的字符串中存在str2指向的的字符串,那么返回第一次出现的位置的指针;
    如果str1指向的字符串中不存在str2指向的的字符串,那么返回NULL
  3. 代码实现:

strstr函数的模拟实现

c 复制代码
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1&&str2);
	const char* p = str1;
	const char* s1 = NULL;
	const char* s2 = NULL;
	//特殊场景的处理
	if (*str2 == '\0')
		return (char*)str1;
	while (*p)//枚举查找的次数
	{
		s1 = p;
		s2 = str2;
		//找一次的匹配过程
		while(*s1 && *s2 && *s1==*s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return (char*)p;
		p++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abccdefghijklmnop";
	char arr2[] = "def";
	char* p = my_strstr(arr1, arr2);
	if (p != NULL)
	{
		printf("找到了,%s\n", p);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

十一.strtok函数

c 复制代码
char *strtok(char* str,const char* delim);
  1. 功能:分割字符串 (根据delim参数中指定的分隔符,将输入字符串str拆分成多个子字符串),修改原始字符串(strtok会直接在原始字符串中插入'\0'终止符,替换分隔符的位置,因此原始字符串会被修改)
  2. 返回值:
  • 成功时返回指向当前子字符串的指针
  • 没有更多子字符串时返回NULL
  1. 使用步骤:
  • 首次调用:传入待分割字符串和分隔符
  • 后续调用:传入NULL和相同的分隔符,继续分割
  • 结束条件:当返回NULL时表示分割完成
  1. 功能演示:
  2. 注意事项:
  • 破坏性操作:strtok会直接修改原始字符串,将其中的分隔符替换为'\0',如果需要保留原字符串,应该先拷贝一份
  • 连续分隔符:多个连续分隔符会被视为单个分隔符,不会返回空字符串
  • 空指针处理:如果输入的str为NULL且没有前序调用,行为未定义

十二.strerror函数

C语言的库函数在使用的时候,如果发生了错误会将一个错误码记录到errno的变量中

基本使用

  1. 函数的使用:
c 复制代码
char* strerror(int errnum);
  1. 功能
  • strerror函数可以通过参数部分的errnum表示错误代码,得到对应的错误信息,并且返回这个错误字符串首字符的地址
  • strerror函数只针对标准库中的函数发生错误后设置的错误码的转换
  • strerror的使用需要包含<string.h>
  1. 使用

perror函数

该函数相当于代替了printf和strerror两个函数步骤,直接将错误信息打印出来

c 复制代码
void perror(const char* str);
  1. 使用:

本次内容到这里就结束了
谢谢观看

若有不足欢迎在评论区讨论。