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

1. 字符函数

1.1 字符分类函数

在C语言中,有一系列专门做字符分类的函数被包括在头文件<ctype.h>

这些函数的区分范围如下:

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

我们来举一个例子来说明这些函数的用法:

int isupper(int C);

isupper函数可以判断参数部分的C是否属于大写字母范围。如果是就返回非0整数,如果不是就返回0。

应用
将字符串中的大写字母转小写,其他字符不变。

#include<stdio.h>
#include<ctype.h>int main(){int i = 0;char str[]="Test String\n";while(str[i]){if(isupper(str[i]))str[i]+=32;putchar(str[i]);i++;}return 0;
}

1.2 字符转换函数

字符转换函数可以大写转小写、小写转大写

函数使用形式如下:

int tolower(int C);
int toupper(int c);

函数应用如下:

#include<stdio.h>
#include<ctype.h>int main(){int i = 0;char str[]="Test string\n";while(str[i]){if(isupper(str[i]))str[i] = tolower(str[i]);putchar(str[i]);i++;}return 0;
}

2. 字符串函数

字符串函数的使用都需要包含头文件<string.h>

2.1 strlen的使用及模拟实现

函数形式如下:

size_t strlen(const char* str);

函数解析及注意事项:

  • strlen函数返回的是在字符串中 \0前面出现的字符个数(不包括 \0
  • 参数指向的字符串必须要以 \0结束
  • 函数的返回值为size_t(无符号整形)
  • strlen的使用要包含头文件<string.h>

函数的模拟实现:
(1)计数器方式

int my_strlen(const char* str) {int count = 0;assert(str);while (*str) {str++;count++;}
}int main() {char* ch = "abcdef";printf("%d", strlen(ch));
}

(2)不创建临时变量,运用函数递归

int my_strlen(const char* str) {assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}int main() {char* ch = "123456";printf("%d",my_strlen(ch));
}

(3)指针 - 指针

int my_strlen(const char* str) {assert(str);char* p = str;while (*p != 0) {p++;}return p - str;
}int main() {char* ch = "123456";printf("%d",my_strlen(ch));
}

2.2 strcpy的使用及模拟实现

函数形式如下:

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

函数解析及注意事项:

  • strcpy函数的作用是将源字符串拷贝到目标字符串
  • 源字符串必须以 \0 结束
  • 源字符串的\0也会被拷贝到目标空间
  • 目标空间必须足够大,确保能存放源字符串
  • 目标空间必须可修改

函数的模拟实现:

char* my_strcpy(char* dest, char* src) {assert(dest);assert(src);char* ret = dest;while (*dest++ = *src++) {;}return ret;
}int main() {char d[] = "abcdef";char* s = "123";printf("%s", my_strcpy(d, s));return 0;
}

2.3 strcat的使用及模拟实现

函数形式如下:

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

函数解析及注意事项:

  • strcat函数的作用是将源字符串追加到目标字符串的后面
  • 源字符串必须以\0结束
  • 目标字符串中也得有\0,否则没办法知道追加从哪里开始
  • 目标空间必须足够的大,能容纳两个字符串的内容
  • 目标空间必须可修改

函数的模拟实现:

char* my_strcat(char* dest, char* src) {assert(dest);assert(src);char* ret = dest;while (*dest) {dest++;}while (*dest++ = *src++) {;}return ret;
}int main() {char d[10] = "abcdef";char* s = "123";printf("%s", my_strcat(d, s));return 0;
}

2.4 strcmp的使用及模拟实现

函数形式如下:

int strcmp(const char* str1, const char* str2);

函数解析及注意事项:

  • strcmp函数的作用是比较两个字符串的大小(比较两个字符串中对应位置上字符ASCII码值的大小)
  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

函数的模拟实现:

int my_strcmp(char* str1, char* str2) {assert(str1);assert(str2);while (*str1 == *str2) {if (*str1 == '\0') {return 0;}str1++;str2++;}return *str1 - *str2;
}int main() {char* ch1 = "abcdef";char* ch2 = "abcf";if (my_strcmp(ch1, ch2) > 0) {printf("ch1 > ch2");}else if (my_strcmp(ch1, ch2) < 0) {printf("ch1 < ch2");}else {printf("ch1 == ch2");}return 0;
}

2.5 strstr的使用及模拟实现

函数的形式如下:

char* strstr(const char* str1, const char* str2);

函数解析及注意事项:

  • strstr函数的作用是返回字符串str2在字符串str1中第一次出现的位置
  • 字符串的比较匹配不包括\0字符,以``\0`作为结束标志

函数的模拟实现:

char* my_strstr(const char* str1, const char* str2) {char* cp = (char*)str1;if (!*str2)return (char*) str1;while (*cp) {//外循环用来刷新开始比较匹配的位置char* s1 = cp;char* s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2)) {//内循环用来比较匹配s1++;s2++;}if (!*s2)//如果s2为\0,说明比较匹配成功return cp;cp++;}return NULL;//如果外层循环已经遍历了一遍还未执行循环内的if语句的话,则说明匹配失败,返回空指针
}

2.6 strncpy的使用

函数形式如下:

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

函数的解析及注意事项:

  • strncpy函数的作用是从源字符串拷贝num个字符到目标空间
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num

2.7 strncat的使用

函数的形式如下:

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

函数的解析及注意事项:

  • strncat函数的作用是将源字符串的前num个字符追加到目标字符串的末尾,在追加一个\0
  • 如果源字符串的长度小于num时,只会讲字符串中到\0的内容追加到目标字符串的末尾

函数使用实例:

#include<stdio.h>
#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",str1);	return 0;
}

2.8 strncmp的使用

函数形式如下:

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

函数的解析及注意事项:

  • strncmp函数的作用是比较str1str2的前num个字符(比较相应位置字符的ASCII码值)
  • 比较的规则与strcmp相同。

2.9 strtok的使用

函数的形式如下:

char* strtok(char* str, const char* sep);

函数的解析及注意事项:

  • strtok函数的作用是将一个字符串分割成几个子字符串
  • sep参数指向一个用作分隔符的字符串
  • 第一个参数指定一个字符串,它包含了0个或多个由sep字符串中一个或多个分隔符分割的标记
  • strtok函数找到str中的一个标记,并将其用\0收尾,返回一个指向这个标记的指针
  • strtok函数的第一个参数不为NULL时,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
  • 如果字符串中不存在更多的标记,返回NULL

注:strtok函数会改变被操作的字符串,所以被strtok函数切割的字符串一般都是临时拷贝的内容并且可修改

函数的使用:

#include<stdio.h>
#include<string.h>int main(){char arr[] = "192.168.6.111";char* sep = ".";char* str = NULL;for(str = strtok(arr, sep); str != NULL; str = strtok(NULL,sep)){printf("%s\n", str);}return 0;
}

2.10 strerror的使用

函数形式如下:

char* strerror(int errnum);

函数底层逻辑及作用:

  • 底层逻辑:在不同的系统和C语言标准库的实现中都规定了一些错误码,放在<errno.h>头文件中,C语言程序启动的时候就会使用一个全局的整型变量errno来记录程序的当前错误码,当程序启动的时候errno0,表示没有错误,当我们在使用标准库中的函数发生错误时,就会减对应的错误码(一个整数)存放在errno中。每个错误码都对应着一个错误信息。
  • 作用strerror函数的作用是把参数部分的错误码对应的错误信息的字符串地址返回。

函数的使用:

#include<stdio.h>
#include<string.h>
#include<errno.h>int main(){FILE* pfile = fopen("unexist.ent","r");if(pfile == NULL)printf ("Error opening file unexist.ent: %s\n", strerror(errno));return 0;
}

同时我们也可以了解一下perror函数,perror函数等同于一次将上方代码中的第9行。

#include<stdio.h>
#include<string.h>
#include<errno.h>int main(){FILE* pfile = fopen("unexist.ent","r");if(pfile == NULL)perror("Error opening file unexist.ent");return 0;
}

今天的介绍就到这里,还要请各位佬儿们多多支持,多多点赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1552623.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle架构之数据库备份和RAC介绍

文章目录 1 数据库备份1.1 数据库备份分类1.1.1 逻辑备份与物理备份1.1.2 完全备份/差异备份/增量备份 1.2 Oracle 逻辑备份1.2.1 EXP/IMP1.2.1.1 EXP导出1.2.1.2 EXP关键字说明1.2.1.3 导入1.2.1.4 IMP关键字说明 1.2.2 EXPDP/IMPDP1.2.2.1 数据泵介绍1.2.2.2 数据泵的使用 1.…

机器智能的自主分级与人、机、环境有关

自主分级是指机器智能在特定任务中根据自身能力、环境变化及人类需求&#xff0c;自动调整其操作和决策水平的能力。随着人工智能技术的不断发展&#xff0c;机器智能的自主分级成为了研究的热点&#xff0c;尤其是在自动驾驶、智能制造和人机协作等领域。自主分级不仅可以提高…

【ios】---swift开发从入门到放弃

swift开发从入门到放弃 环境swift入门变量与常量类型安全和类型推断print函数字符串整数双精度布尔运算符数组集合set字典区间元祖可选类型循环语句条件语句switch语句函数枚举类型闭包数组方法结构体 环境 1.在App Store下载Xcode 2.新建项目&#xff08;可以先使用这个&…

数据结构-4.1.特殊矩阵的压缩存储

一.一维数组的存储结构&#xff1a; 1.知道一维数组的起始地址&#xff0c;就可以求出任意下标对应的元素所在的地址&#xff1b; 2.注&#xff1a;如果数组下标从1开始&#xff0c;上述公式的i就要改为i-1&#xff1b; 3.数组里的元素类型相同&#xff0c;因此所占空间也相同…

转码第 188 天-高德算法实习面经分享

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新人如何快速入门算法岗、如何准备面试攻略、面试常考点、大模型项目落地经验分享等热门话题进行了深入的讨论。…

嵌入式 ADC基础知识

在现实世界中&#xff0c;常见的信号大都是模拟量&#xff0c;像温度、声音、气压等&#xff0c;但在信号的处理与传输中&#xff0c;为了减少噪声的干扰&#xff0c;较多使用的是数字量。因此我们经常会将现实中的模拟信号&#xff0c;通过 ADC 转换为数字信号进行运算、传输、…

6.2 微服务 负载均衡 架构模式 分类和应用实践

微服务 负载均衡 架构模式 分类 目录概述需求&#xff1a; 设计思路实现思路分析1.1. 微服务架构概述2.2. 负载均衡概念3.3. 负载均衡架构模式3.1 客户端负载均衡 架构模式 要点3.2 服务器端负载均衡 架构模式3.3 代理负载均衡 架构模式 4.4.负载均衡算法3.4 DNS负载均衡 架构模…

通信工程学习:什么是FTP文件传输协议

FTP&#xff1a;文件传输协议 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上交换文件的协议&#xff0c;它定义了文件传输时使用的命令和响应。作为最古老的互联网协议之一&#xff0c;FTP至今仍被广泛使用&#xff0c;并在网…

PCL 投影滤波器

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 投影滤波 2.1.2 可视化 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、…

算法课习题汇总(3)

循环日程表 设有N个选手进行循环比赛&#xff0c;其中N2M&#xff0c;要求每名选手要与其他N−1名选手都赛一次&#xff0c;每名选手每天比赛一次&#xff0c;循环赛共进行N−1天&#xff0c;要求每天没有选手轮空。 例如4个人进行比赛&#xff1a; 思路&#xff1a; 把表格…

20道面试题001

常考语法就是指针&#xff0c;指针与数组、指针与字符串、指针与结构体、指针与函数之间的关系与使用&#xff0c; 以上课为准&#xff0c;辅助《深度理解C指针》这本书。 1. 指针与数组 定义: 数组名在表达式中通常被视为指向数组首元素的指针。 访问元素: 可以通过指针访问数…

递归函数设计技巧

目录 1.路飞吃桃子的问题--应试难度 2.弹簧板问题--应试难度 3.递归实现指数型枚举--校招难度 4.递归实现组合型枚举--校招难度 5.递归实现排列型枚举--校招难度 1.路飞吃桃子的问题--应试难度 我们可以说下两个案例&#xff0c;反正是最后一天的时候&#xff0c;只剩下了一…

pnpm在monorepo架构下不能引用其他模块的问题

一、研究背景 monorepo架构项目目录结构&#xff1a; - common- index.ts- ... - main- index.ts- ... - web- vue-demo- ... pnpm在monorepo架构下使用以下命令 pnpm -F main add common # or pnpm --filter main add common 并不能在main/index.ts中使用common/index.ts…

从概念到使用全面了解Llama 3 这个迄今为止最强大的开源模型

概述 mate最近发布了 Llama3&#xff0c;下一代最先进的开源大语言模型&#xff08;LLM&#xff09;。正如本文的综合评论所述&#xff0c;Llama 3 以其前身奠定的基础为基础&#xff0c;旨在增强 Llama 2 成为 ChatGPT 重要开源竞争对手的能力 Llama 2&#xff1a;深入探讨 C…

Spring Boot驱动的足球青训俱乐部管理解决方案

1 绪论 1.1研究背景 随着科技的发展&#xff0c;计算机的应用&#xff0c;人们的生活方方面面都和互联网密不可分。计算机的普及使得人们的生活更加方便快捷&#xff0c;网络也遍及到我们生活的每个角落&#xff0c;二十一世纪信息化时代的到来&#xff0c;随着社会科技的不断…

中国电信解锁万亿参数大模型:TeleAI的创新与突破

首个由万卡集群训练出来的万亿参数大模型&#xff0c;已被一家央企解锁。 具体而言&#xff0c;为了推动纯国产人工智能的探索&#xff0c;带来这条新路径的正是中国电信人工智能研究院&#xff08;TeleAI&#xff09;。 该研究院由中国电信集团的CTO、首席科学家兼院长李学龙…

docker零基础入门教程

注意 本系列文章已升级、转移至我的自建站点中&#xff0c;本章原文为&#xff1a;Docker入门 目录 注意1.前言2.docker安装3.docker基本使用4.打包docker镜像5.docker进阶 1.前言 如果你长期写C/C代码&#xff0c;那你应该很容易发现C/C开源项目存在的一个严重问题&#xff…

【React】入门Day01 —— 从基础概念到实战应用

目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发&#xff0c;是用于构建 Web 和原生…

XFTP-8下载安装教程

下载地址 https://www.xshell.com/zh/free-for-home-school/ 新建XFTP文件夹 安装过程 选择新建的文件夹 此处默认即可 填写信息提交注册 点击生成的链接 点击后来&#xff0c;完成安装

WebRTC Connection Negotiate解决

最近有个项目 &#xff0c;部署之后一直显示&#xff0c;查了一些资料还是没有解决&#xff0c;无奈只有自己研究解决&#xff1f; 什么是内网穿透&#xff1f; 我们访问我们自己的官网产品页面&#xff0c;我们的服务器是一个单独的个体&#xff0c;有独立的公网ip&#xf…