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

C语言复习笔记--字符函数和字符串函数(上)

        在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

        首先来看下字符函数.

字符分类函数

        C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h.具体的一些函数和功能见下.

        这些函数的使⽤⽅法⾮常类似,我们来以islower来看下,islower是判断字符是否为小写字母的函数.函数原型见下

int islower ( int c );

通过返回值来说明是否是⼩写字⺟,如果是小写字母就返回非0的整数,如果不是⼩写字⺟,则返回 0。

        下面让我们通过一个练习来使用一下它

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{char arr[] = { "AccDSnj" };char* p = arr;while (*p){if (islower(*p)){*p -= 32;//小写ASCII码-32就会变为大写}p++;}printf("%s\n", arr);return 0;
}

字符转换函数

        C语⾔提供了2个字符转换函数:

        看见了这两个函数后,上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数现在就可以直接使⽤ toupper函数.

#include<ctype.h>
int main()
{char arr[] = { "AccDSnj" };char* p = arr;while (*p){if (islower(*p)){*p = toupper(*p);//toupper的返回值才是所传参数的大写,所以直接toupper(*p);无法改变arr中的值}p++;}printf("%s\n", arr);return 0;
}

        使用这些函数一定要包含<ctype.h>这个头文件.

        下面来看下字符串函数吧.

strlen的使用和模拟实现

        首先看下它的函数原型

size_t   strlen  ( const char * str );

        下面看下使用的主意事项

        要包含<string.h>这个头文件.且返回值为无符号整型,无符号整型进行加减是不会出现<0的数的.

        我们对strlen应该很熟悉了,在之前我们就已经使用过并且用两种方式模拟实现过strlen(指针-指针和指针后移用count计数)下面我们看下不能创建临时变量计数器怎么实现strlen函数.

//可以用递归的方式去实现
size_t strlen(char* p)
{if ('\0'== * p){return 0;}else{return 1 + strlen(p + 1);}
}
int main()
{char arr[] = { "asffsg" };printf("%d\n", strlen(arr));return 0;
}

strcpy的使用和模拟实现

        函数原型.

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

        函数作用将source位置的字符串copy到destination的位置上(包括source字符串中的\0)

        下面看下注意事项

        strcpy的自主实现:

char* strcpy(char* des, const char* p)
{char* re = des;//先保存一下目标位置的开始,以便函数返回while (*des++ = *p++){;}//刚好到最后'\0'时*p赋给了*des//并且*des++ = *p++式子的返回值是'\0'(ASCII码为0)循环刚好结束return re;
}
int main()
{char arr[20] = { 0 };char* p = "asbcde";//被拷贝的可以是不可修改的也可以可以修改的字符串//printf("%s\n",strcpy(arr, p));//这种和下面的那种都可以char* s = strcpy(arr, p);printf("%s\n", s);return 0;
}

strcat 的使用和模拟实现

        先看函数原型

char * strcat (char *dest, const char*src);

        函数作用:在dest字符串后追加src字符串,覆盖dest字符串的\0,但是会追加src的\0.

        下面是一些注意事项.

\

        以及思考一个问题字符串⾃⼰给⾃⼰追加,如何?

        根据函数作用来看是不可以的,因为在追加时会覆盖原来字符串的\0,之后就无法找到要追加的字符串的结束标志了.但是在VS的库函数中的strcat可以做到,但是不建议使用strcat自己给自己追加,因为这只是编译器的自行优化,可能其他编译器下就不可以了.

        下面来看实现:

char* strcat(char* des,const char* p)
{char* re = des;while (*des){des++;}while (*des++ = *p++){;}return re;
}
int main()
{char arr[20] = "abc";printf("%s\n", arr);char* p = "xxx";strcat(arr, p);printf("%s\n", arr);return 0;
}

        因为上面介绍的三个函数在使用时可能会发生原来空间不够大导致溢出从而引发错误,为了避免这样的错误,函数库中提供了可以由程序员控制拷贝字母数的下面三个函数.这些函数无需自己实现,只要会使用就可以了.

strncpy 函数的使用      

        首先来看下函数原型

char * strncpy ( char * destination, const char * source, size_t num );

        作用:将source的字符串的前num的字符拷贝到destination的位置上.

        如果源字符串长度大于num则num是几就拷贝几个,不在后面追加\0.下面看下使用:

#include <string.h>
int main()
{char arr[20] = "xxxxxxxxxxxxx";char* p = "abc";strncpy(arr, p, 2);printf("%s\n", arr);strncpy(arr, p, 5);printf("%s\n", arr);return 0;
}

输出结果:

strncmp函数的使用

        函数原型:

int strncmp ( const char * str1, const char * str2, size_t num );

        比较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.(num不能大于str1和str2中短的那个字符串的长度(算\0)).

        下面是此函数的返回值:

        下面看下使用

#include <string.h>
int main()
{char* p = "abcd";char* p1 = "abp";printf("%d\n",strncmp(p, p1, 2));printf("%d\n",strncmp(p, p1, 3));return 0;
}

        输出结果: 

 

strncat 函数的使用

        函数原型:

char * strncat ( char * destination, const char * source, size_t num );

        如果source 指向的字符串的⻓度⼩于num的时候,不会向后添加\0让追加字符数达到num.

        下面看下使用:

#include <string.h>
int main()
{char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);printf("%s\n", str1);return 0;
}

        输出结果:

        今天的复习就到这里了,我们明天下篇见.

http://www.xdnf.cn/news/19783.html

相关文章:

  • Xen安装ubuntu并启动过程记录
  • final关键字带来的问题
  • 大数据赋能,全面提升‘企业服务平台’实际效能!
  • 见多识广3:帕累托最优解与帕累托前沿
  • HAL详解
  • C#学习第16天:聊聊反射
  • API 即 MCP|Higress 发布 MCP Marketplace,加速存量 API 跨入 MCP 时代
  • 电脑开机启动慢的原因
  • Python 的 pip 命令详解,涵盖常用操作和高级用法
  • ES数据库索引报错
  • 十、数据库day02--SQL语句01
  • 基于Python的MCP Server技术解析:从AI代理到实时数据处理的智能化实践
  • 博客系统案例练习-回顾
  • MMAction2安装
  • 3、整合前端基础交互页面
  • 幽灵依赖与常见依赖管理
  • C++每日训练 Day 17:构建响应式加载动画与异步数据处理
  • 笔记本电脑屏幕闪烁是怎么回事 原因及解决方法
  • 【Drools+springboot3规则匹配】
  • 【计算机网络 | 第一篇】计算机网络基础知识
  • 【Linux】部署vfstpd服务端,让客户端通过访问不同的端口号,可以实现访问不同的目录
  • 刀片服务器的散热构造方式
  • C++17 新特性简解
  • 分享4-5月工信部排考计划
  • 评测 Doubao-1.5-thinking-pro | 豆包·深度思考模型
  • “AI问诊助手”落地武汉市中心医院,深兰科技助力医疗数智化升级
  • NOIP2015提高组.信息传递
  • 线程池 RejectedExecutionException 异常:Task ... rejected from...
  • 体验 OceanBase 参数模板功能
  • PLM系统如何支持利益相关者分析?沟通矩阵设计