015-C语言字符函数和字符串函数

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

文章目录

  • C语言字符函数和字符串函数
    • 1. 字符分类函数
    • 2. 字符转换函数
    • 3. strlen
    • 4. strcpy
    • 5. strcat
    • 6. strcmp
    • 7. strncpy
    • 8. strncat
    • 9. strncmp
    • 10. strstr
    • 11. strtok
    • 12. strerror

1. 字符分类函数

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

使用这些函数需要包含头文件ctype.h

函数如果参数满足下面条件就为真
iscntrl任何字符
isspace空白字符:空格 ' '、换页 '\f'、换行 '\n'、回车 '\r'、制表符 '\t'、垂直制表符 '\v'
isdigit十进制数字0~9
igxdigit十六进制数字1~9a~fA~f
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~zA~Z
isalnum字母或数字a~zA~Z0~9
ispunct标点符号,任何不属于字母或数字的可打印字符
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

使用这些函数的方法几乎都是一样的,只需要传入需要判断的字符,然后接受对应返回值即可。

2. 字符转换函数

C语言提供了2个字符转换函数。

使用这些函数需要包含头文件ctype.h

函数作用
tolower将传进去的小写字母转成大写
toupper将传进去的大写字母转成小写

3. strlen

size_t strlen(const char * str)

我们在之前就已经使用过很多次strlen函数,这里做一下总结:

  • 字符串以'\0'作为结束标志,strlen函数返回值是在字符串中'\0'前面出现的个数。
  • 参数指向的字符串必须要以'\0'结束。
  • 注意函数的返回值为size_tsize_t本质上是无符号整数。
#include <stdio.h>
#include <string.h>int main()
{const char* str = "hello world";printf("%d\n", strlen(str)); // 11return 0;
}

在这里插入图片描述

4. strcpy

char * strcpy(char * destination, const char * source);
  • 函数参数:

    • destination:目标字符串。
    • source:源字符串。
    • 源字符串的内容将会拷贝到目标字符串中。
  • 源字符串必须以'\0'结束。

  • 源字符串中的'\0'会被拷贝到目标字符串中。

  • 目标字符串的空间必须足够大,保证能够放得下源字符串的内容

  • 目标空间必须可变(非const)。

  • 注意,在VS2022环境下无法直接使用strcpy,解决办法是加上#define _CRT_SECURE_NO_WARNINGS

    在这里插入图片描述

    在后文有部分函数也会出现这个问题,看到这个警告后,按上述处理即可,后文将不再赘述此类问题。

#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20];strcpy(str2, str1);printf("%s", str2);return 0;
}

在这里插入图片描述

5. strcat

char * strcat ( char * destination, const char * source );
  • 函数参数:

    • destination:目标字符串。
    • source:源字符串。
    • 源字符串中的内容将被追加到目标字符串。
  • 源字符串必须以'\0'结束。

  • 目标字符串也必须以'\0'结束。

  • 目标空间必须足够大,保证能放得下追加后的内容。

  • 目标空间必须可变。

#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123456";strcat(str2, str1);printf("%s", str2);return 0;
}

在这里插入图片描述

6. strcmp

int strcmp ( const char * str1, const char * str2 );
  • 函数参数

    • 两个待比较的字符串。
    • 比较规则,按照字典序比较:
      • 从前往后比较两个字符串相同位置的字符。
      • 当字符的ACSII码值小时,则该字符串更小,反之该字符串更大。
      • 当字符相同时,比较下一个位置的字符。
      • 当字符串1到末尾时,字符串2还未结束,那么字串1比字符串2小。
      • 当两个字符串内容完全一致时,判定为相等。
  • 第一个字符大于第二个字符串则返回大于0的数字。

  • 两个字符串相等则返回0。

  • 第二个字符串大于第一个字符串则返回小于0的数字。

#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";int tmp = strcmp(str2, str1);if (tmp > 0)printf("str2 > str1\n");else if (tmp == 0)printf("str2 == str1\n");elseprintf("str2 < str1\n");return 0;
}

在这里插入图片描述

7. strncpy

char * strncpy ( char * destination, const char * source, size_t num );
  • 函数参数:
    • 与strcpy不同的,num代表需要从源字符串拷贝的字符个数。
  • 如果源字符串的长度小于num,则拷贝完源字符串后,在目标后面追加\0,直到num个。
  • 需要注意的是,如果num小于source的长度,那么destination字符串的最后将不会有\0,打印时可能会造成越界访问。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char* str2[20];char* str3[20];strncpy(str2, str1, 20);strncpy(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}

在这里插入图片描述

上面打印的str3就出现了越界访问的问题。

8. strncat

char * strncat ( char * destination, const char * source, size_t num );
  • 函数参数:
    • 与strcat不同的,num代表需要从源字符串追加的字符个数。
  • 如果源字符串长度小于num,则追加整个源字串。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123";char str3[20] = "456";strncat(str2, str1, 20);strncat(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}

在这里插入图片描述

9. strncmp

int strncmp ( const char * str1, const char * str2, size_t num );
  • 函数参数
    • 与strcmp不同的,num代表比较前num个字符数。
  • 如果待比较的字符串长度比num小,则整个字符串参与比较。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";printf("%d\n", strncmp(str1, str2, 5));printf("%d\n", strncmp(str1, str2, 20));return 0;
}

在这里插入图片描述

10. strstr

const char * strstr ( const char * str1, const char * str2 );char * strstr (       char * str1, const char * str2 );
  • 返回指向str1字符串中第一次出现str2字符串的指针。
  • 如果str2不是str1的一部分,则返回NULL。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";const char* str2 = "world";char* p = strstr(str1, str2);printf("%p\n%s\n", p, p);return 0;
}

在这里插入图片描述

11. strtok

char * strtok ( char * str, const char * delimiters );
  • 函数参数:

    • str:需要处理的目标字符串。
    • delimiters:字符分隔符合集。
  • 遍历str字符串,如果碰到delimiters中的字符,就将那个字符改成\0然后返回开始寻找的位置的指针。

  • 如果传入str指针传入NULL,则strtok将从上一个被修改成\0的字符的后一个位置开始寻找。

  • 如果没有找到,则返回NULL。

#include <stdio.h>
#include <string.h>int main()
{char str1[] = "192.168.0.0";char* p = strtok(str1, ".");while (p){printf("%s\n", p);p = strtok(NULL, ".");}return 0;
}

在这里插入图片描述

12. strerror

char * strerror ( int errnum );
  • 函数参数:

    • errnum:代表错误码,当程序异常退出时,会返回一个错误码。
  • 将错误码传入strerror函数,就可以获取错误码对应的描述信息,判断出现了什么错误。

打印0~10号错误码对应的错误信息:

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CGAL边折叠edge_collapse的问题

使用edge_collapse对一个模型简化&#xff0c;之后回收垃圾&#xff0c;collect_garbage 处理之前的顶点和三角形数量&#xff1a; number_of_vertices: 955730 number_of_faces: 1903410 num_vertices: 955730 num_faces: 1903410 处理之后的顶点和三角形数量&#xff1a;…

用c语言实现——顺序队列支持用户输入交互、入队、出队、查找、遍历、计算队列长度等功能。确定判断判满的方法为:牺牲一个存储单元方式

一、知识介绍 1.基本原理 在顺序队列中&#xff0c;我们使用一个固定大小的数组来存储队列中的元素&#xff0c;并使用两个指针&#xff08;front 和 rear&#xff09;来分别表示队头和队尾的位置。 队列为空的条件&#xff1a;front rear 队列满的条件&#xff1a;rear 1…

JVM 系列:JVM 内存结构深度解析

你点赞了吗&#xff1f;你关注了吗&#xff1f;每天分享干货好文。 高并发解决方案与架构设计。 海量数据存储和性能优化。 通用框架/组件设计与封装。 如何设计合适的技术架构&#xff1f; 如何成功转型架构设计与技术管理&#xff1f; 在竞争激烈的大环境下&#xff0c…

手机上的APN是什么,该怎么设置

网上说改个APN就可以让网速快几倍&#xff0c;那到底APN是个什么东西&#xff0c;真的能让网速快几倍吗&#xff1f; APN的作用 网络连接基础&#xff1a;APN&#xff08;接入点名称&#xff09;是手机连接移动网络的“桥梁”&#xff0c;负责识别运营商网络类型&#xff08;…

微服务治理与可观测性

服务注册与发现 核心功能 服务实例动态变化&#xff1a;实例可能因扩缩容、故障或迁移导致IP变动。服务依赖解耦&#xff1a;调用方无需硬编码服务地址&#xff0c;降低耦合度。负载均衡&#xff1a;自动选择健康实例&#xff0c;提升系统可用性。 核心组件 服务注册中心&am…

嵌入式linux系统中内存管理的方法与实现

第一:linux内核管理详解图形 第二:Linux内存管理详细分析 深入剖析Linux内核内存管理 作为嵌入式系统开发者,理解Linux内核的内存管理对于开发高效、稳定的系统至关重要。在这篇文章中,我们将详细解析Linux内核如何划分物理内存和虚拟内存,页表、MMU(内存管理单元)与TL…

【dataframe显示不全问题】打开一个行列超多的excel转成df之后行列显示不全

出现问题如下图&#xff1a; 解决方案&#xff5e; display.width解决列显示不全 pd.set_option(display.max_columns,1000) pd.set_option(display.width, 1000) pd.set_option(display.max_colwidth,1000) pd.set_option(display.max_rows,1000)

Linux——Shell编程之正则表达式与文本处理器(笔记)

目录 基础正则表达式 1:基础正则表达式示例 &#xff08;4&#xff09;查找任意一个字符“.”与重新字符“*” &#xff08;5&#xff09;查找连续字符范围“{ }” 文本处理器 一、sed工具 二、awk工具 &#xff08;1&#xff09;按行输出文本 &#xff08;2&#xff0…

OpenHarmony系统-源码下载,环境搭建,编译,烧录,调试

获取源码 以OpenHarmony5.0.3为例 repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-5.0.3-Release --no-repo-verify repo sync -c repo forall -c git lfs pull搭建环境 安装必要的工具和命令 apt-get install -y apt-utils binutils bison flex bc …

Vue3 本地打包启动白屏解决思路!! !

“为什么我访问 http://127.0.0.1:5501/index.html 白屏&#xff0c;删了 index.html 再访问 / 就又活过来了&#xff1f;” —— 你的项目与 SPA 路由的“宫斗大戏” 一、问题复现 场景 本地通过 VSCode Live Server&#xff08;或其他静态服务器&#xff09;启动了打包后的 V…

数字人(2):数字人技术全景透视(2025演进版)

随着人工智能技术的迅猛发展,数字人技术发展也是一日千里。站在当下,着眼未来,我们一起在回眸透视过去的基础上,一起共同眺望数字人技术的未来。 一、数字人技术体系重构 我们可以用三维定义对数字人技术进行框架重构 维度 技术内涵 典型特征 物理层 人体数字化建模技术 …

小刚说C语言刷题——1035 判断成绩等级

1.题目描述 输入某学生成绩&#xff0c;如果 86分以上(包括 86分&#xff09;则输出 VERY GOOD &#xff0c;如果在 60到 85之间的则输出 GOOD (包括 60和 85)&#xff0c;小于 60 的则输出 BAD。 输入 输入只有一行&#xff0c;包括 1个整数。 输出 输出只有一行&#xf…

React-在使用map循环数组渲染列表时须指定唯一且稳定值的key

在渲染列表的时候&#xff0c;我们须给组件或者元素分配一个唯一值的key, key是一个特殊的属性&#xff0c;不会最终加在元素上面&#xff0c;也无法通过props.key来获取&#xff0c;仅在react内部使用。react中的key本质是服务于diff算法, 它的默认值是null, 在diff算法过程中…

Zookeeper的通知机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的通知机制是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; Zookeeper的通知机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 的通知机制是其核心特性之一&#xf…

【LangChain实战】构建下一代智能问答系统:从RAG架构到生产级优化

打破传统问答系统的次元壁 当ChatGPT在2022年掀起AI革命时&#xff0c;开发者们很快发现一个残酷现实&#xff1a;通用大模型在专业领域的表现如同拿着地图的盲人&#xff0c;既无法理解企业私有数据&#xff0c;也无法保证事实准确性。这催生了RAG&#xff08;检索增强生成&a…

UDS中功能寻址可以请求多帧数据嘛?当ECU响应首帧后,诊断仪是通过物理寻址发送流控帧嘛?

文章目录 1. 前言📢1.1 功能寻址是否支持请求多帧数据?1.2 ECU发送首帧(FF)后,诊断仪如何发送流控帧(FC)?1.3 协议依据(ISO 14229-1)1.4 实际应用注意事项总结1. 前言📢 在UDS(Unified Diagnostic Services)协议中,功能寻址与物理寻址的使用规则以及多帧数据传…

PHP异常处理__Throwable

在 PHP 里&#xff0c;Throwable 是一个极为关键的接口&#xff0c;自 PHP 7 起被引入。它为错误和异常处理构建了一个统一的框架。下面会详细介绍 Throwable 的相关内容。 1. 基本概念 Throwable 是 Exception 和 Error 的父接口。在 PHP 7 之前&#xff0c;异常&#xff08…

无需训练的具身导航探索!TRAVEL:零样本视觉语言导航中的检索与对齐

作者&#xff1a; Navid Rajabi, Jana Kosecka 单位&#xff1a;乔治梅森大学计算机科学系 论文标题&#xff1a;TRAVEL: Training-Free Retrieval and Alignment for Vision-and-Language Navigation 论文链接&#xff1a;https://arxiv.org/pdf/2502.07306 主要贡献 提出…

Vue3+Vite+TypeScript+Element Plus开发-22.客制Table组件

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由 -动态增加路由 动态路由-动态删除…

Java读取JSON文件并将其中元素转为JSON对象输出

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Java读取JSON文件并将其中元素转为JSON对象输…