【C语言/期末复习】字符和字符串函数(附思维导图/例题)

一、字符分类函数

(1)使用时包含的头文件

ctype.h

(2)相关库函数
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 任何可打印字符,包括图形字符和空白字符(0~31是不可打印字符)

例题:【PTA浙大版《C语言程序设计(第4版)》/函数题】习题6-1 分类统计字符个数(使用库函数解决)(附检测点)

(3)使用示例
  1. 函数原型:
    int islower(int c)
  2. islower 是能够判断参数部分的 c 是否是⼩写字⺟的。
  3. 通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回0。

二、字符转换函数

(1)大写字母转小写字母
int tolower(int c);//将参数传进去的⼤写字⺟转⼩写
(2)小写字母转大写字母
int toupper(int c);//将参数传进去的⼩写字⺟转⼤写

三、字符串函数

(1)strlen
  1. 函数原型
    size_t strlen ( const char * str );
  2. 使用注意点 
    字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )。
    参数指向的字符串必须要以 '\0' 结束。
    注意函数的返回值为size_t,是⽆符号的( 易错)
    strlen的使⽤需要包含头⽂件
  3. 模拟实现(1)
     
    size_t my_strlen(const char* str)
    {
    	size_t count = 0;
    	assert(str != NULL);
    	while (*str)
    	{
    		count++;
    		str++;
    	}
    
    	return count;
    }

  4. 模拟实现(2)
    size_t my_strlen2(const char* str)
    {
    	const char* start = str;
    	assert(str != NULL);
    	while(*str)
    	{
    		str++;
    	}
    
    	return str - start;
    }
    //循环结束后,返回指针 str 与起始指针 start 之间的偏移量,即可得到字符串的长度。
  5. 模拟实现(3)
     
    size_t my_strlen3(const char* str)
    {
    	if (*str == '\0')
    		return 0;
    	else
    		return 1 + my_strlen3(str + 1);
    }
    //递归调用的参数是字符串指针 str 加上1,即指向下一个字符的位置
    //递归调用返回的结果加上1,表示当前字符的长度。

(2)strcpy
  1. 函数原型
    char* strcpy(char * destination, const char * source );
  2. 使用注意点
    将source中的字符串拷贝到destination字符串中
    源字符串必须以 '\0' 结束。
    会将源字符串中的 '\0' 拷⻉到⽬标空间。
    ⽬标空间必须⾜够⼤,以确保能存放源字符串。
    ⽬标空间必须可修改。(不能是常量字符串等)

  3. 模拟实现
    void my_strcpy(char* dest, char* source)
    {
    	assert(dest != NULL);
    	while (*dest++ = *source++)
    	{
    		;
    	}
    }
    
4.详细逻辑
  • 通过一个 while 循环,将源字符串中的字符一个一个地复制到目标字符串中,直到遇到字符串结束符 '\0' 时停止循环。
  • 循环中,每次先将 *source 指向的字符赋值给 *dest 指向的位置,然后source 和 dest 分别自增以继续复制下一个字符,最后判断复制的字符是否是字符串结束符,如果不是则继续循环。

(3)strcat
  1. 函数原型
    char * strcat ( char * destination, const char * source );

  2. 使用注意点
    将源字符串的内容追加到目标字符串的末尾
    源字符串必须以 '\0' 结束
    ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
    ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
    ⽬标空间必须可修改

     
  3. 模拟实现
    char* my_strcat(char* dest, const char* source)
    {
    	char* ret = dest;
    //首先定义一个指针ret指向dest,以便后面返回dest字符串的指针。
    	assert(dest != NULL);
    	assert(source != NULL);
    //判断dest和source是否为空指针,如果其中任意一个为空,则会产生运行时错误,所以使assert函数进行断言判断。
    //进入while循环,当*dest不为'\0'时(也就是字符串还没有结束),执行dest++,将指针指向下一个字符的地址
    	while (*dest)
    	{
    		dest++;
    	}
    //退出第一个while循环后,此时dest指针指向dest字符串的结尾,也就是'\0'的位置
    	while(*dest++ = *source++)
    	{
    		;
    	}
    //进入第二个while循环,将source中的字符赋值给dest,直到source等于'\0'时结束循环。
    	return ret;
    }
    

(4)strcmp
  1. 函数原型
    int strcmp ( const char * str1, const char * str2 )

  2. 标准规定
    ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。
    第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
    第⼀个字符串等于第⼆个字符串,则返回0
    第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

  3. 模拟实现
    int my_strcmp(char* s1, char* s2)
    {
    	while (*s1 == *s2)
    	{
    		if (*s1 == '\0')
    		{
    			return 0;
    		}
    		s1++;
    		s2++;
    	}
    //return *s1 - *s2;
    	if (*s1 > *s2)
    		return 1;
    	else
    		return -1;
    }

    4.详细逻辑
    使用 while 循环来比较两个字符串的每个字符,直到遇到不相等的字符或者其中一个字符串结束(即遇到 \0 结束符)为止。
    在循环中,通过比较指针所指向的字符 *s1 和 *s2 是否相等来判断是否继续循环。如果相等,则继续比较下一个字符;如果不相等,跳出循环。
    如果循环结束时两个字符串完全相等(即都以 \0 结束),则返回 0,表示两个字符串相等。
    如果循环结束时遇到不相等的字符,比较两个字符的大小关系。如果 *s1 大于 *s2,则返回 1,表示 s1 大于 s2;如果 *s1 小于 *s2,则返回 -1,表示 s1 小于 s2。

(5)strncpy
  1. 函数原型
    char * strncpy ( char * destination, const char * source, size_t num );

  2. 使用注意点
    拷⻉num个字符从源字符串到⽬标空间。
    如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
    如果源字符串的长度小于 n,则 strncpy 会将整个源字符串拷贝到目标字符串中,并在剩余的空间内填充 \0 来达到指定的拷贝长度。这可能导致目标字符串不以 \0 结束,因此需要手动添加 \0。
    如果源字符串的长度大于等于 n,则 strncpy 只会拷贝前 n 个字符到目标字符串中,不会自动添加 \0 字符。这可能导致目标字符串没有以 \0 结束,需要手动添加 \0。
(6)strncat
  1. 函数原型
    char * strncat ( char * destination, const char * source, size_t num ); 
  2. 使用注意点
    将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符
    如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到
    \0 的内容追加到destination指向的字符串末尾

(7)strncmp
  1. 函数原型
    int strncmp ( const char * str1, const char * str2, size_t num );
  2. 使用注意点
     
    ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

(8)strstr
  1. 函数原型
    char * strstr ( const char * str1, const char * str2);

  2. 使用注意点
    函数返回字符串str2在字符串str1中第⼀次出现的位置
    字符串的⽐较匹配不包含 \0 字符

  3. 模拟实现
    #include
    char* my_strstr(const char* str1, const char* str2)
    {
    	char* cur = str1;
        //记录匹配成功的起始位置
    	char* s1 = NULL;
        //后续让s1代替str1遍历(考虑类似abbbcdef bbc情况)
    	char* s2 = NULL;
        //后续让s2代替str2遍历
    	assert(str1 && str2);
    
    	if (*str2 == '\0')
    	{
    		return (char*)str1;
    	}
    
    	
        while (*cur)
    	{
    		s1 = cur;
    		s2 = (char*)str2;
    		while (*s1 && *s2 && *s1 == *s2)
    		{
    			s1++;
    			s2++;
    		}
    		if (*s2 == '\0')
    		{
    			return (char*)cur;
    		}
    		cur++;
    	}
    
    	return NULL;
    }

(9)strtok 函数的使⽤


cplusplus strtok详细解读

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

3.应用举例
①将zhangsan@163.com拆分为zhangsan 163 com
【C语言/期末复习】字符和字符串函数(附思维导图/例题)_第1张图片
 

//初步认识

#include
#include
int main()
{
	char arr[] = "[email protected]";
	char arr2[30] = { 0 };
	strcpy(arr2, arr);
	const char* p = "@.";
	char* s = strtok(arr, p);
	printf("%s\n", s);
	s = strtok(NULL, p);
	printf("%s\n", s);
	s = strtok(NULL, p);
	printf("%s\n", s);
	return 0;

}
//进阶
#include
#include

int main()
{
	char arr[] = "[email protected]";
	char arr2[30] = { 0 };
	strcpy(arr2, arr);
	const char* p = "@.";
	char* s = NULL;
	
	for (s = strtok(arr, p); s != NULL; s = strtok(NULL, p))
	{
		printf("%s\n", s);
	}

}

②将192.168.3.100拆分为192 168 3 100
【C语言/期末复习】字符和字符串函数(附思维导图/例题)_第2张图片
 

#include
#include

int main()
{
	char arr[] = "192.168.3.100";
	char arr2[30] = { 0 };
	strcpy(arr2, arr);
	const char* p = ".";
	char* s = NULL;
	
	for (s = strtok(arr, p); s != NULL; s = strtok(NULL, p))
	{
		printf("%s\n", s);
	}

}

(10)strerror 函数的使⽤
 

1.函数原型
 
char * strerror ( int errnum );
2.使用
  • strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
  • 在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
     
3.Windows11+VS2022下相关错误信息

【C语言/期末复习】字符和字符串函数(附思维导图/例题)_第3张图片

4.举例
#include 
#include 
#include 
int main ()
{
 FILE * pFile;
 pFile = fopen ("unexist.ent","r");
 if (pFile == NULL)
 printf ("Error opening file unexist.ent: %s\n", strerror(errno));
 return 0;
}


【C语言/期末复习】字符和字符串函数(附思维导图/例题)_第4张图片

你可能感兴趣的:(新手友好,c语言,开发语言,学习,笔记)