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

新号别搞:字符+字符串+内存 函数


1、字符函数


1.1 字符分类函数

头⽂件ctype.h参数符合条件就返回真( !0 )

譬如int islower ( int c );其他用法与之一致。

大小写转化举例

int i = 0; char c; char str[] = "Test String.\n"; while (str[i]) { c = str[i]; if (islower(c)) c -= 32; putchar(c); i++; } //【main】

1.2 字符转换函数

  • inttolower(intc );将传进去的参数的大写字母转小写
  • inttoupper(intc );将传进去的参数的小写字母转大写

大小写转换-toupper

int i = 0; char str[] = "Test String.\n"; char c; while (str[i]) { c = str[i]; if (islower(c)) c = toupper(c); putchar(c); i++; } //【main】

2、字符串函数


2.1strlen

size_tstrlen(const char* str ); 头文件<string.h>

  • 统计字符串中'\0' 之前的字符的个数
  • str 参数(指针)指向的字符串必须要以 '\0' 结束
  • 返回类型是 size_t ,返回字符串的⻓度,打印用 %z

举例使⽤

const char* str = "abcdef"; printf("%zd\n", strlen(str)); //【main】

模拟实现

  • 计数器方式
#include <assert.h> int my_strlen(const char * str) { int count = 0;assert(str); while(*str) { count++;str++; } return count; }
  • 不创建临时变量计数器
int my_strlen(const char * str) { assert(str); if(*str == '\0') return 0; else return 1 + my_strlen(str+1); }
  • 指针-指针
int my_strlen(char *s) { assert(str); char *p = s; while(*p != '\0') p++; return p - s; }

2.2 字符串拷贝

2.2.1strcpy

char*strcpy(char* destination,const char* source ); 头文件<string.h>
  • 拷贝到源头字符串中的\0 为⽌
  • destination (指针) 必须⾜够⼤且可修改
  • source (指针) 必须以 '\0' 结束,会将 '\0' 拷贝到 destination
  • 返回目标空间起始地址

举例使用

char arr1[10] = {0}; char arr2[] = "hello"; strcpy(arr1, arr2); printf("%s\n", arr1); //【main】

模拟实现

1.参数顺序2.函数的功能,停⽌条件3.assert4.const修饰指针5.函数返回值
char* my_strcpy(char *dest, const char*src) { char *ret = dest; assert(dest != NULL&& src != NULL); while((*dest++ = *src++)) ; return ret; }

2.2.2strncpy

char *strncpy (char *destination,const char *source, size_t num ); 头文件<string.h>

  • 返回目标空间的起始地址
  • num从source指向的字符串中最多拷贝的字符个数

举例使用

char arr1[20] = {0}; char arr2[] = "abcdefghi"; char* str = strncpy(arr1, arr2, 5); printf("%s\n", arr1); printf("%s\n", str); //【main】

模拟实现


2.2.3比较strcpy和strncp

  • strcpy函数拷贝到 \0 为⽌,⽬标空间不够,会越界。
  • strncpy指定长度拷贝,避免了 \0 的限制,同样要考虑目标空间小

2.3 字符串追加

2.3.1strcat

char*strcat(char* destination,const char* source ); 头文件<string.h>
  • source (指针)须以'\0' 结束,destination也要有 '\0'
  • destination要够大且可修改
  • 不能追加自己

举例使用

har arr1[20] = "hello "; char arr2[] = "world"; strcat(arr1, arr2); printf("%s\n", arr1); //【main】

模拟实现

char* my_strcat(char *dest, const char*src) { char *ret = dest; assert(dest != NULL); assert(src != NULL); while(*dest) dest++; while((*dest++ = *src++))//赋值:把 src 指向的字符赋给 dest。 ; //移动:dest、src 同时后移一位。 return ret; //判断:检查赋值的字符是不是 \0 }

2.3.2strncat

char *strncat (char *destination,const char *source,size_tnum ); 头文件<string.h>

  • 返回⽬标空间的起始地址
  • num最多追加的字符的个数

举例使用

char arr1[20] = "hello "; char arr2[] = "world"; char* str = strncat(arr1, arr2, 5); printf("%s\n", arr1); printf("%s\n", str); //【main】

模拟实现


2.3.3比较strcat和strncat

  • strncat多一个参数
  • strcat函数包含 \0都追加过去 ;strncat函数指定了追加的⻓度
  • strncat函数中源字符串中⼀定会有 \0
  • strncat更加灵活安全

2.4 字符串比较

2.4.1strcmp

intstrcmp (const char *str1,const char *str2 ); 头文件<string.h>

  • 从两个字符串的第⼀个字符开始⽐较,如果两字符的ASCII码值相等,则⽐较下⼀个字符。
    直到遇到不相等的两个字符,或者字符串结束。
  • str1 、str2:指针,分别指向要⽐较的第⼀个及第二个字符串。

举例使用

char arr1[] = "abcdef"; char arr2[] = "abq"; int ret = strcmp(arr1, arr2);printf("%d\n", ret); if(ret > 0) printf("arr1 > arr2\n"); else if(ret == 0) printf("arr1 == arr2\n"); else printf("arr1 < arr2\n"); //【main】

模拟实现

int my_strcmp (const char * str1, const char * str2) { int ret = 0 ; assert(str1 != NULL); assert(str2 != NULL); while(*str1 == *str2) { if(*str1 == '\0') return 0; str1++; str2++; } return *str1-*str2; }

2.4.2strncmp

intstrncmp (const char *str1,const char *str2,size_tnum ); 头文件<string.h>

  • 比较 str1str2指向的两个字符串的内容,最多⽐较num字符
  • str1、str2 :指针,指向⼀个比较的及另外⼀个⽐较的的字符串
  • num最多比较的字符个数。

举例使用

char arr1[] = "abcdef"; char arr2[] = "abcqw"; int ret1 = strncmp(arr1, arr2, 3); printf("%d\n", ret1); int ret2 = strncmp(arr1, arr2, 4); printf("%d\n", ret2); //【main】

2.4.3⽐较strcmp和strncmp

  • 参数不同
  • strncmp可以⽐较任意长度
  • strncmp函数更灵活安全

2.5 其他字符串函数

2.5.1 字符串查找strstr

char *strstr (const char *str1,const char *str2); 头文件<string.h>

  • 查找 str2 (指针) 指向的字符串在 str1 (指针) 指向的字符串中第⼀次出现的位置
    在⼀个字符串(str1) 中查找⼦字符串 (str2).

举例使用

char str[] ="This is a simple string"; char * pch; pch = strstr (str,"simple"); if (pch != NULL) printf("%s\n", pch); else printf("查找的字符串不存在\n"); //【main】

模拟实现

char * strstr (const char * str1, const char * str2) { char *cp = (char *) str1; char *s1, *s2; if ( !*str2 ) //特殊情况:str2是空字符串时 return((char *)str1); //直接返回str1 while (*cp) { s1 = cp; s2 = (char *) str2; while ( *s1 && *s2 && !(*s1-*s2) ) s1++, s2++; if (!*s2) return(cp); //返回第⼀次出现的起始 cp++; } return(NULL); //找不到则返回NULL }

2.5.2 分割+修改原始字符串strtok

char *strtok(char *str,const char *delim); 头文件<string.h>

  • 功能

  • 参数

  • 返回值

  • 流程

举例使用

char arr[] = "192.168.6.111"; const char* sep = "."; const char* str = NULL; char buf[30] = {0}; strcpy(buf, arr); //将arr中的字符串拷⻉到buf中,对buf的内容进⾏切割 for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep)) { printf("%s\n", str); } //【main】

注意事项


2.5.3 显示错误strerror

char*strerror (interrnum ); 头文件<string.h> + <errno.h>

  • errnum 表⽰错误码,得到对应的错误信息,并返回错误信息字符串⾸字符的地址;
    只针对标准库中的函数发⽣错误后设置的错误码的转换;
  • errnum传递的是errno(C语⾔中⼀个全局变量) 的值,当库函数的调⽤发⽣错误的时候,就会将本次错误的错误码存放在 errno 这个变量中,使⽤这个全局变量需要包含⼀个头⽂件 errno.h
  • 返回 通过错误码得到的错误信息字符串的⾸字符的地址

举例使用

FILE * pFile = NULL; //fopen函数以读的形式打开⽂件,如果⽂件不存在,则打开失败。 pFile = fopen ("unexist.ent", "r"); if (pFile == NULL) { printf ("错误信息是:%s\n", strerror(errno)); return 1;//错误返回 } //【main】
  • 错误信息是:No such file or directory

2.5.4 显示错误perror

voidperror (const char *str ); 头文件<string.h>

  • perror 函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息
  • 其使用与strerror相似

举例使用

FILE * pFile = NULL; pFile = fopen ("unexist.ent", "r"); if (pFile == NULL) { perror("错误信息是"); return 1; } //【main】
  • 错误信息是: No such file or director

3、内存函数




1、

http://www.jsqmd.com/news/880591/

相关文章:

  • 别再让Ubuntu卡成PPT了!手把手教你给32G大内存服务器调整Swap分区(附永久生效配置)
  • 如何用Python快速接入Taotoken调用多个大模型
  • 想找适合孩子独自参加的北京研学,有没有师生配比高的好机构 - 品牌2025
  • 2026年Q2智能安全头盔帽专业选型技术解析:交警执法记录仪/人员定位安全帽/单兵执法记录仪/安全生产检查记录仪/选择指南 - 优质品牌商家
  • 如何快速掌握窗口控制:简单实用的分辨率调整指南
  • 别再手动算卡路里了!用Python+OpenCV做个AI食物热量估算器(附完整代码)
  • 2026小时工找工作优质服务机构推荐:工厂劳务派遣外包/工厂直招找工作/当天入职劳务派遣/日结工招聘找工作/普工劳务派遣/选择指南 - 优质品牌商家
  • 快拼箱采购避坑2026:工地活动板房、彩钢板房、彩钢活动房、折叠箱房、拓展箱房、移动活动板房、箱式活动房、网红箱选择指南 - 优质品牌商家
  • Wireshark抓ESP包为何有的加密有的明文?StrongSwan与Linux内核协作真相
  • 2026Q2台州经济纠纷律师:台州刑事律师/台州医疗纠纷律师/台州婚姻家事律师/台州工伤赔偿纠纷律师/台州法律顾问/选择指南 - 优质品牌商家
  • 股市学习心得-技术指标学习(布林线+MACD)
  • 我随便做的几道python题目
  • Node.js 服务端项目集成 Taotoken 多模型 API 的实践
  • 2026年Q2天津家族信托律师推荐:周宇律师的专业服务解析 - 2026年企业推荐榜
  • 2026年紫外线杀菌器技术解析与选型参考指南:不锈钢杀菌器、大功率紫外灯、水处理杀菌器、浸没式杀菌器、消毒杀菌器选择指南 - 优质品牌商家
  • 刷短视频的隐形危害:你的多巴胺系统正在被“劫持”
  • leetcode42雨水
  • 2026年当下广东省冰花漆采购指南:聚焦云勋新材料科技有限公司 - 2026年企业推荐榜
  • 2026年至今,上海新风系统源头服务专家:合宜人居深度解析 - 2026年企业推荐榜
  • 千年盛世手游官网下载:千年盛世最新官方下载渠道
  • Pillow 10升级后,你的图像标注代码还好吗?从getsize到getbbox的迁移避坑指南
  • 求推荐靠谱的孩子独立北京行,老师负责的研学机构 - 品牌2025
  • ge:昇腾CANN的图引擎架构剖析
  • 2026排污许可证办理全解析:北京排水排污许可证/北京酒店特行许可证审批/城镇污水排入排水管网许可证/宾馆特行许可证/选择指南 - 优质品牌商家
  • 四川热轧H型钢公司、正规钢材生产供货厂商 - 四川盛世钢联营销中心
  • Qt6.5数控加工CAM框架实战:基于工厂模式与分层架构的CamCore完整实现
  • cann-learning-hub:昇腾CANN社区的学习中心
  • 办公场景横向测评:GPT-5.5、DeepSeek、Gemini 处理公文优劣对比
  • MNIST识别项目复盘:除了准确率97%,我们更应该关注数据预处理与损失函数的选择
  • 【无标题】学生用户画像—考勤主题扩建标签构建