当前位置: 首页 > news >正文

#C语言——学习攻略:探索字符函数和字符串函数(一)--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现

🌟菜鸟主页:@晨非辰的主页

👀学习专栏:《C语言学习》

💪学习阶段:C语言方向初学者

名言欣赏:"编程的本质是理解问题,然后把它分解成可执行的步骤。"


目录

1. 字符分类函数

2. 字符转换函数

3. strlen函数

3.1 strlen函数使用示范

3.2 strlen的返回值

  3.3 模拟实现strlen函数

4. strcpy函数(格式符隐式解引用)

4.1 strcpy函数使用示范

4.2 模拟实现strcpy函数

5. strcat函数

5.1 strcat函数使用示范

5.2 模拟实现strcat函数


1. 字符分类函数

--在C语言中有一系列函数专门做字符分类判断一个字符属于什么类型的字符。

--以下函数都需要包含头文件:<ctype.h>

       

--这些函数的使用方式十分相似,下面就将一个函数为例解释: islower 函数

int lower(int a);

        --函数判断字母是否为小写字母,是-返回非0整数,不是-返回0;

--练习:通过代码将字符串中的小写字母转换为大写字母:

#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "Im a Chinese!";int i = 0;;while (arr[i]){if (islower(arr[i])){arr[i] -= 32;//大写字母Ascll码值与小写字母差32}printf("%c", arr[i]);i++;}return 0;
}

2. 字符转换函数

--除了上述的字符分类函数,还有这实现字符之间转换的字符转化函数;

--使用时包含头文件:<ctype.h>

int tolower(int c);  将传进去的大写字母转换为小写字母;
int toupper(int c);  将传进去的小写字母转换为大写字母;

--有了这两个函数就可以直接实现大小写转换,不用在+-32进行。

--练习:通过代码利用上述两个函数实现将字符串中的小写字符转换为大写:

int main()
{char arr[] = "Im a Chinese!";int i = 0;while (arr[i]){if (islower(arr[i])){arr[i] = toupper(arr[i]);}printf("%c", arr[i]);i++;}return 0;
}

3. strlen函数

size_t strlen (const char* str);

--介绍: 

  • 参数: str —— 指向 '\0' 结尾的字符串的指针;

  • 返回值: size_t 类型的无符号整数,表示字符串的长度(不含 '\0' );

  • 核心功能:计算字符串长度从起始地址开始遍历,直到遇到 '\0' 结束。

3.1 strlen函数使用示范

--使用须知:

  •  字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' );
  • 参数指向的字符串必须要以 '\0' 结束;
  • 注意函数的返回值为 size_t,是无符号的( 易错 );
  • strlen的使用需要包含头文件<string.h>;
#include <string.h>
int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}

3.2 strlen的返回值

--为什么说返回值 size_t类型易错?请看下面代码:

#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0)//一般认为输出<=,但实际不是{printf(">\n")else{printf("<=\n");}return 0;
}

        --一般认为上面 3-6 输出 <=,但实际不是 ,输出 > :因为函数返回类型为无符号整型,所以运算结果也为无符号整型(>=0);想让它符合我们的认知,可以将类型强转为 int :

int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if ((int)strlen(str2) - (int)strlen(str1) > 0){printf(">\n");}else{printf("<=\n");}return 0;
}

  3.3 模拟实现strlen函数

 --下面将呈现三种方法·,其中两种方式在前面已经见过:

--方式1:计算器

#include <assert.h>
size_t strlen(char* str)
{int count = 0;int i = 0;assert(str != NULL);while (*str){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";size_t re = strlen(arr);printf("%d\n", re);return 0;
}

--方式2:指针-指针(参考:4.2部分--#C语言——学习攻略:深挖指针路线(一))

size_t my_strlen(char* str)
{assert(str != NULL);char* p = str;while (*str){str++;}return str - p;
}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%zd\n", ret);return 0;
}

--方式3:函数递归

size_t my_strlen(const char* str)
{assert(str != NULL);if (*str == '\0'){return 0;}else{return 1 + my_strlen(str + 1);}}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%d", ret);return 0;
}


4. strcpy函数(格式符隐式解引用)

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

--介绍:

  • 功能:字符串拷贝,将源头(src)的字符串拷贝到目标(dest )空间中,拷贝到源头字符串中的 '\0' 为止;

  • 返回值:strcpy函数返回的目标空间的起始地址;

  • 参数: destination指针,指向目的地空间;source指针,指向源头数据。

4.1 strcpy函数使用示范

使用须知——

  • 源字符串必须以 '\0' 结束;
  • 会将源字符串中的 '\0' 拷贝到目标空间;
  • 目标空间必须足够大,以确保能存放源字符串,[ ]里不能为空;
  • 目标空间必须可修改(字符串数组),比如常量字符串无法修改; 
  • 使用需要包含头文件<string.h>;
int main()
{char arr1[] = "hello";char arr2[20] = { 0 };char* ret = strcpy(arr2, arr1);printf("%s\n", ret);    无需解引用,%s 自动处理return 0;
}

隐式解引用:

--对于为什么输出 ret 不使用 %p :当要输出指针指向的内容时 %s 格式符本质上会隐式解引用指针,


4.2 模拟实现strcpy函数

void my_strcpy(char* dest, char* src)
{while (*dest++ = *src++){;}}
int main()
{char arr1[] = "hello world!";char arr2[] = "*************";my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}

5. strcat函数

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

--介绍:

  • 功能:字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中;
  • 参数:destination指针,指向目的地空间;source指针,指向源头数据;
  • 返回值:strcat函数返回的目标空间的起始地址;

5.1 strcat函数使用示范

使用须知——

  • 源字符串必须以 '\0' 结束;
  • 目标字符串中也得有 \0 ,否则无法知道追加从哪开始;
  • 目标空间必须有足够的大,能容纳下源字符串的内容,[ ]里不能为空;
  • 目标空间必须可修改;
  • 使用需要包含头文件<string.h>;
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = "world";char* p = strcat(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);return 0;
}

5.2 模拟实现strcat函数

char* mystrcat(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest){dest++;}//找到目标字符串中的\0,明确从那里开始追加。while ((*dest++ = *src++)){;}return p;
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char* ret = mystrcat(arr1, arr2);printf("%s", ret);return 0;
}

结语:本篇文章到此结束,下一篇将会为大家呈现字符函数和字符串函数的剩余内容,如果这篇文章对你的学习有帮助的话,欢迎一起讨论学习,你这么帅、这么美给个三连吧~~~

http://www.dtcms.com/a/312059.html

相关文章:

  • 数据库理论
  • 【MATLAB】(五)向量
  • 变量筛选—随机森林特征重要性
  • windows@Path环境变量中同名可执行文件优先级竞争问题@Scoop安装软件命令行启动存在同名竞争问题的解决
  • 解决 InputStream 只能读取一次问题
  • Java语言核心特性全解析:从面向对象到跨平台原理
  • Docker--将非root用户添加docker用户组,解决频繁sudo执行输入密码的问题
  • 【动态规划 | 子序列问题】子序列问题的最优解:动态规划方法详解
  • RK628F HDMI-IN调试:应用接口使用
  • Vulnhub ELECTRICAL靶机复现(附提权)
  • QPainter::CompositionMode解析
  • junit总@mockbaen与@mock的区别与联系
  • flutter分享到支付宝
  • Linux进程控制核心:创建·等待·终止·替换
  • Qt 信号和槽正常连接返回true,但发送信号后槽函数无响应问题【已解决】
  • 深入解析Java Stream Sink接口
  • Design Compiler:Milkyway库的创建与使用
  • 1-7〔 OSCP ◈ 研记 〕❘ 信息收集▸主动采集E:SMB基础
  • 硬件-可靠性学习DAY1——系统可靠性设计指南:从原理到实践
  • Markdown 中的图表 Mermaid 与 classDiagram
  • Thread 中的 run() 方法 和 start() 方法的
  • 笔记:C语言中指向指针的指针作用
  • MQTT协议测试环境部署
  • 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException
  • (nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)
  • UNet改进(29):记忆增强注意力机制在UNet中的创新应用-原理、实现与性能提升
  • 【嵌入式汇编基础】-ARM架构基础(三)
  • 动态规划解最长回文子串:深入解析与优化问题
  • 【redis】基于工业界技术分享的内容总结
  • JS的作用域