【C语言】解决不同场景字符串问题:巧妙运用字符串函数

请添加图片描述

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、字符函数
    • 1.1 字符分类函数
      • 1.1.1 islower
      • 1.1.2 isupper
    • 1.2字符转换函数
    • 1.3 字符分类函数与字符转换函数配合
  • 二、 字符串函数
    • 2.1 Strlen
    • 2.2 Strcpy
    • 2.3 Strcat
    • 2.4 Strcmp
    • 对于strcpy和strcat越界的调整
    • 2.5 Strncpy
    • 2.6 Strncat
    • 2.7 Strncmp
    • 2.8 Strstr
    • 2.9 Strtok
    • 2.10 Strerror


一、字符函数

字符函数一般分为字符分类函数字符转换函数,它们使用的时候可以相互打配合,这些字符函数统一声明在库函数头文件ctype.h


1.1 字符分类函数

在这里插入图片描述

以上这些函数使用方式非常类似,这里简单使用两个常用字符分类函数

1.1.1 islower

在这里插入图片描述

#include <stdio.h>
#include <ctype.h>
int main()
{
   int ret=islower('a')
       return 0;
}

【说明】

  • 字符类型是整型类型的子集,这里可以使用ASCII表达字符
  • 判断参数部分是否为小写字母
  • 如果是小写字母,就返回非零的整数(为真)
  • 如果不是小写字母,就返回零(为假)

1.1.2 isupper

在这里插入图片描述

#include <stdio.h>
#include <ctype.h>
int main()
{
    int ret=isupper('A')
        return 0;
}

【说明】

  • 字符类型是整型类型的子集,这里可以使用ASCII表达字符
  • 判断参数部分是否为大写字母
  • 如果是小写字母,就返回非零的整数(为真)
  • 如果不是小写字母,就返回零(为假)

如果对于其他字符分类函数使用感兴趣,可以点击这次链接,经行查找搜索->[字符分类函数](scanf - C++ Reference (cplusplus.com))

1.2字符转换函数

C语言提供了以下两个字符转换函数:

int tolower(int c)
功能:将参数部分为小写转化为大写
int toupper (int C)
功能:将参数部分为大写转化为小写
int main()
{
    int ret=iolower('A');
    printf("%d",ret);//这里打印出的就是小写a
    return 0;
}

1.3 字符分类函数与字符转换函数配合

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

二、 字符串函数

2.1 Strlen

在这里插入图片描述

int main()
{
    char * p = "abcd";
    int ret = strlen(p);
    return 0;
}

【说明】:

  • 计算字符串在\0前面出现的字符个数
  • 具体细节,参考这篇文【指针篇5/5】

2.2 Strcpy

在这里插入图片描述

  • 将原字符串(source)拷贝到目标字符串(destination)。
  • 返回值是返回目标字符串中首地址。
int main()
{
    cosnt char pc[] = "abcdf";

    1. char p[] = "xxx";  //目标空间缺乏
    2. char p[] = "XXXXXXxxxx"; //目标空间充足
    strcpy(p, pc);
    printf("%s", p);
    return 0;
}

【说明】

  • 源字符必须以'\0'作为结束标志
  • 源字符串中的'\0'拷贝到目标空间
  • 目标字符串是可修改的
  • 目标空间需要足够大,不然可能会溢出
  • 如果目标空间过小,虽然能打印结果,但会冲出缓冲区

2.3 Strcat

在这里插入图片描述

  • 在目标字符串末尾’\0’的位置上追加源字符串。
  • 目标字符串的首地址。
int main()
{
   char p[20] = "abcdefl";

   const char pc[] = "xxxx";
   strcat(p, pc,);
   printf("%s", p);
   return 0;
}

【说明】:

  • 源字符必须以'\0'作为结束标志
  • 目标字符串需要'\0'作为结束标志,作为追加位置
  • 目标字符串是可修改的
  • 目标空间需要足够大,空间容纳下两个字符串连接后的大小

2.4 Strcmp

在这里插入图片描述

  • strcmp不是比较字符串的长度,而是比较两个字符串中对应位置字符的ASCII码值
int main()
{
    char p[20] = "abcdef";
    char pc[20] = "abcf";
    int ret=strcmp(p, pc);
    if (ret > 0)
    {
        printf("大于");
    }
    else if (ret == 0)
    {
        printf("等于");
    }
    else
    {
        printf("小于");
    }
    return 0;
}

说明】:

  • 如果第一个字符串大于第二个字符串的大小,就返回大于0的数
  • 如果第一个字符串等于第二个字符串的大小,就返回0
  • 如果第一个字符串小于第二个字符串的大小,就返回小于0的数

对于strcpy和strcat越界的调整

问题】:

  • 在使用字符串函数中,strcpy和strcat都存在冲出缓冲区的风险,对此有什么办法可以尽量避免?

库为了对应这种情况的发生,提供了在strcpy和strcat基础上改良了可以控制个数的函数。


2.5 Strncpy

在这里插入图片描述

【说明】

  • 将源字符串的num个字符拷贝到目标空间中
  • 如果num大于源字符串的数量,拷贝完源字符串后,以后追加'\0'直到num个才停下

2.6 Strncat

在这里插入图片描述

【说明】:

  • 将源字符串的num个字符追加到目标空间中
  • 如果num大于源字符串的数量,则拷贝到'\0'直接停下

2.7 Strncmp

在这里插入图片描述

【说明】:

  • 比较dest和str的前num个字符,如果在num前发现了不同,则返回数值,不再继续
  • 如果dest和str相等,一直到了num个字符都相等,则返回0

2.8 Strstr

在这里插入图片描述

  • 在字符串中寻找匹配子字符串并且返回子字符串的地址
int main()
{  
    char str1[] = "abccdefg";
    char str2[] = "cd";
    char *ret=strstr(str1,str2);
    printf("%s",ret);
    return 0;
}

【说明】:

  • str1和str2不能为NULL.
  • 如果str2不属于str1的字符串,则返回NULL.

2.9 Strtok

在这里插入图片描述

  • 第一个参数指向一个字符串,包括了一个及多个的分隔符和字符组合

  • ​ 第二个参数是指向分割符的集合

  • 将一个字符串拆分标记,标记是由分隔符分割由任何字符分隔的连续字符串序列

int main()
{
	char str[] = "192.152.142@dads";
	char sep[] = ".@";
	char* p = NULL;
	for (p = strtok(str, sep); p != NULL; p=strtok(NULL, sep))//循环中利用上面返回值三点的相关知识
	{
	printf("%s\n", str);
	}
     return 0;
}

【说明】:

  1. 第一个参数不为NULL,则函数找到str1的第一个标记并且记录当下标记的位置
  2. 第一个参数为NULL,则从标记的位置,出发寻找下一个标记位置
  3. 如果字符串中找不到更多的标记,则返回NULL.

循环体逻辑说明

  • 因为使用一次strtok函数,只能找个一个标记点,所以我们需要用到循环
  • 字符串中找不到更多的标记,则返回NULL,这个作为结束条件
  • strtok函数会找下一个标记,以\0来结尾,返回指向这个标记的指针(strtok会改变被操作的字符串,所以strtok函数分割得到的字符串,一般是拷贝内容是可以被修改的)

2.10 Strerror

在这里插入图片描述

  • 获得参数部分的错误码对应的错误信息

  • 将错误信息的字符串地址返回

#include <stdio.h>
#include <errno.h>
int main()
{
    for (int i = 0; i < 10; i++)
    {
        printf("%d:%s\n",i, strerror(i));
    }
    return 0;
}

请添加图片描述

【说明】

  • 在不同的系统和C语言标准库的实现中将这一些错误码的信息,一般都放在<errno.h>头文件中
  • 当C语言程序启动的时候,会有一个全面变量errno去记录程序中错误码,在程序启动的是时候,errno为0表示没有错误
  • 如果在使用标准库中的函数,出现错误,那么就有会由errno去记录错误码,如果错误码是=的数字,不知道什么含义**?所以每一个错误码都对应着错误信息**

讲到这里我们也是可以了解下perror函数,它的功能是直接将错误信息打印出来,比较暴力

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
    FILE*p=fopen("add.txt","r");//r的意思打开文件进行输入操作。该文件必须存在。
    //FILE * fopen ( const char * filename, const char * mode );
    if(p==NULL)
    {
        perror("Error opening file add.txt:")//Error opening file add.txt: No such file or directory
    }
    return 0;
}

请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android中TabLayout与ViewPager结合使用生命周期详解

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家&#xff0c; &#x1f449;点击跳转到教程 效果 使用的布局如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> …

踏准芯片定制风口的灿芯股份,护城河足够深吗?

近年来&#xff0c;芯片定制渐成风潮&#xff0c;不仅位于下游、自身有巨大芯片需求的科技巨头如谷歌、OpenAI等纷纷转向定制&#xff0c;而且产业中游主打标准化芯片的主流芯片设计公司如博通、英伟达等&#xff0c;也相继开辟或加码定制业务。 风潮背后&#xff0c;一方面是…

【JavaEE网络】从数据链路层到应用层的DNS

目录 数据链路层以太网 DNS 数据链路层 越往下与程序员越远 代表协议&#xff1a;以太网。平常用的网线也叫“以太网线”&#xff0c;平常用的交换机也叫“以太网交换机” 以太网 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含…

Git笔记-常用指令

Git笔记-常用指令 一、概述二、仓库管理二、缓存区操作1. 添加文件到缓存区2. 取消缓存文件3. 忽略列表 三、日志状态信息四、分支操作五、六、 一、概述 这里记录一些git常用的指令。 二、仓库管理 # 本地仓库初始化 git init# 克隆仓库 git clone git_url # git clone ht…

Unity之ShaderGraph入门简介与配置

前言 ShaderGraph是Unity的一个可视化着色器编辑工具,它允许开发者在不编写代码的情况下创建复杂的着色器效果。ShaderGraph提供了一个直观的图形界面,用户可以通过拖拽节点并连接它们来构建自定义的着色器。用户可以在ShaderGraph中使用各种节点,如数学运算、纹理采样、颜…

亚马逊Lazada速卖通卖家必备:利用自养号测评提升店铺排名与销量

Wish与亚马逊、速卖通、eBay等知名的跨境电商平台有所区别&#xff0c;它专注于移动端市场。对于许多初次涉足跨境电商领域的新手卖家而言&#xff0c;他们往往困惑于如何在Wish上起步&#xff0c;因为该平台的运营模式与其他平台有所不同。Wish是一款基于手机端App的跨境电商平…

TypeScript 基础学习笔记:interface 与 type 的异同

TypeScript 学习笔记&#xff1a;interface 与 type 的异同 &#x1f3a3; 引言 在 TypeScript的世界里&#xff0c;精准的类型定义是保证代码质量与团队协作效率的关键。interface 和 type 作为两种核心的类型定义工具&#xff0c;它们各自承载着不同的设计意图与应用场景。本…

建材物料小程序商城的作用是什么

建材物料如门窗、马桶、涂料、瓷砖等有着大量需求者&#xff0c;传统模式中客户主要是同城进店咨询查看&#xff0c;但随时电商深入生活和商家模式更新&#xff0c;如今线上店铺消费也同样火热。 尤其是厂商或品牌经销商&#xff0c;无论线下还是线上都不影响生意开展&#xf…

C语言 | Leetcode C语言题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; int mySqrt(int x) {long int i 0;for(i0;;i){long int a i*i;long int b (i1)*(i1);if(a < x&&b > x){break;}}return i; }

LeetCode:三数之和

文章收录于LeetCode专栏 三数之和 给你一个包含n个整数的数组nums&#xff0c;判断nums中是否存在三个元素a、b、c &#xff0c;并使得a b c 0 &#xff1f;请你找出所有和为0且不重复的三元组。   注意&#xff1a;答案中不可以包含重复的三元组。   示例 1&#xff1a…

proxmox宿主机安装桌面

装完proxmox启动后一般进入shell界面&#xff0c;之后都是另外一台电脑连接web管理等操作&#xff0c;一直用起来还好。不过这样需要另外一台电脑连接管理操作&#xff0c;有时候调试时毕竟还是会有些不方便&#xff0c;就想能不能在宿主机上装个桌面做这类事&#xff0c;今天用…

Python基础学习之logging模块

在Python编程中&#xff0c;日志记录&#xff08;Logging&#xff09;是一个非常重要的功能。它不仅可以帮助我们追踪和调试代码中的错误&#xff0c;还可以记录程序运行时的关键信息&#xff0c;以便后续分析和优化。Python标准库中的logging模块为我们提供了强大的日志记录功…

第07-6章 应用层详解

HTTP、SSL&#xff1a;基于TCP&#xff0c;HTTP端口:80、HTTPS&#xff08;加密&#xff09;端口&#xff1a;443&#xff1b;FTP:基于TCP&#xff0c;两类端口&#xff1a;21、20&#xff08;数据传输之前需要建立连接此时是21&#xff0c;真正传输数据时用20&#xff09;TFTP…

Linux: Netfilter 简介

文章目录 1. 前言2. Netfilter 简介2.1 Netfilter 的功能2.2 Netfilter 示例2.3 Netfilter 实现概览2.3.1 Netfilter hook 的 注册 和 注销2.3.2 Netfilter hook 的触发2.3.2.1 NF_INET_PRE_ROUTING2.3.2.2 NF_INET_LOCAL_IN2.3.2.3 NF_INET_FORWARD2.3.2.4 NF_INET_LOCAL_OUT2…

【MySQL】——用户和权限管理(二)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Day15-JavaWeb开发-Maven高级-分模块设计与开发继承与聚合私服

1. Maven高级-分模块设计与开发 2. Maven高级-继承与聚合 2.1 继承关系实现 2.2 版本锁定 2.3 聚合实现 3. Maven高级-私服 3.1 私服-介绍 3.2 私服-资源上传与下载 4. Web开发-完结

【mysql】深入探索mysql中的各种约束条件

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

快速的异地组网工具?

【天联】是一款能够快速搭建异地组网的工具&#xff0c;其应用场景非常广泛。 零售、收银软件应用&#xff1a;通过结合【天联】&#xff0c;医药、餐饮、商超等零售行业可以实现异地统一管理。不论是分布在不同地区的门店&#xff0c;还是总部和各个分支机构&#xff0c;都可以…

工业光源环形系列一平面无影光源特点

产品特点 ◆LED灯珠均匀排布经过漫射板特殊角度反射达到漫射效果&#xff1a; ◆光源均匀性高&#xff0c;漫射效果好。

浪漫编码:手把手教你实现校园表白墙功能

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;浪漫编码&#xff1a;手把手教你实现校园表白墙功能 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 这里写目录标题 表白墙数据准备引入MyBatis和MySQL驱动依赖…
最新文章