【c语言】字符串常见函数 上

news2024/10/6 3:12:58

🎈个人主页:甜美的江
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:c语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

【c语言】字符串常见函数 上

  • 一、字符串的基本概念
  • 二、字符串处理函数概述
  • 三、字符串赋值和拷贝函数
    • 3.1 strcpy (String Copy)
    • 3.2 strncpy (String Copy with Size Limit)
    • 3.3 strcat (String Concatenate)
    • 3.4. strncat (String Concatenate with Size Limit)
  • 四、字符串比较函数
    • 4.1 strcmp 函数:
    • 4.2 strncmp 函数:
  • 五 总结

引言:

在C语言中,字符串是一种常见的数据类型,用于存储文本信息。字符串的处理是编程中常见任务之一,而C语言提供了丰富的字符串处理函数来方便开发者对字符串进行操作。

本篇博客将深入探讨C语言中字符串的基本概念以及常见的字符串处理函数,旨在帮助读者更好地理解和应用这些功能强大的工具。

在这里插入图片描述

一、字符串的基本概念

在C语言中,字符串是一串字符的序列,用于表示文本数据。

字符串在C语言中以字符数组的形式表示,字符数组中的每个元素存储一个字符,并且以空字符(‘\0’)结尾,表示字符串的结束。

在C语言中,可以使用字符数组来表示字符串,例如:

char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

上面的示例定义了一个包含5个字符的字符数组,用于表示字符串"Hello"。

数组的最后一个元素是空字符(‘\0’),它表示字符串的结束。空字符是C语言中字符串的特殊字符,用于标识字符串的结尾。

另一种表示字符串的方式是使用双引号(“”)括起来的字符序列。

例如:

char str[] = "Hello";

在这种情况下,编译器会自动在字符串的末尾添加一个空字符(‘\0’),因此不需要显式地指定数组的大小。

无论使用哪种方式表示字符串,在C语言中,字符串都是以字符数组的形式存储,以空字符(‘\0’)结尾,以便于程序能够确定字符串的结束位置。

这种以空字符结尾的表示方式被称为“以null结尾的字符数组”。

想要对字符串有更深入的了解可以看我写的这篇博客

字符串概念详解

二、字符串处理函数概述

在C语言中,有许多常见的字符串处理函数可用于对字符串进行各种操作。

以下是一些常见的字符串处理函数及其功能和用途的简要概述:

1 strcpy():

功能:用于将一个字符串复制到另一个字符串中。

用途:常用于字符串的赋值和拷贝操作。

2 strncpy():

功能:将指定长度的一个字符串复制到另一个字符串中。

用途:与strcpy()类似,但可以指定要复制的字符数,避免溢出。

3 strcat():

功能:将一个字符串连接到另一个字符串的末尾。

用途:用于字符串的拼接操作,将两个字符串合并成一个字符串。

4 strncat():

功能:将指定长度的一个字符串连接到另一个字符串的末尾。

用途:与strcat()类似,但可以指定要连接的字符数,避免溢出。

5 strcmp():

功能:比较两个字符串是否相等。

用途:用于字符串的比较操作,判断两个字符串是否相同。

6 strncmp():

功能:比较两个字符串的前n个字符是否相等。

用途:与strcmp()类似,但可以指定要比较的字符数。

7 strlen():

功能:计算字符串的长度,即字符串中的字符数(不包括结尾的空字符)。

用途:常用于确定字符串的长度,例如在循环中遍历字符串或为动态分配内存做准备。

8 strchr():

功能:在字符串中查找指定字符的第一次出现位置。

用途:用于查找字符串中特定字符的位置。

9 strrchr():

功能:在字符串中查找指定字符的最后一次出现位置。

用途:与strchr()类似,但从字符串的末尾开始搜索。

10 strstr():

功能:在字符串中查找指定子串的第一次出现位置。

用途:用于在字符串中查找子串,返回子串在字符串中的位置。

这些函数是C语言中常见的字符串处理函数,它们提供了各种功能,可以用于对字符串进行复制、连接、比较、查找等操作。通过合理使用这些函数,可以方便地处理字符串数据,实现各种字符串操作需求。

三、字符串赋值和拷贝函数

3.1 strcpy (String Copy)

用法:

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

功能:

将源字符串的内容复制到目标字符串中,直到遇到源字符串的空字符(‘\0’)。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[20];

    strcpy(destination, source);

    printf("Copied string: %s\n", destination);
    return 0;
}

结果:

Copied string: Hello, World!

代码分析:

这段C代码首先包含了标准输入输出库 <stdio.h> 和字符串处理库 <string.h>。

在 main 函数中,一个名为 source 的字符数组被初始化为 “Hello, World!”,并且另一个字符数组 destination 被定义为容纳至多20个字符的空间。

然后,strcpy 函数被调用,将 source 中的字符串复制到 destination 中。由于 destination的大小为20,足够容纳源字符串,因此这个操作是安全的。

最后,使用 printf 打印出复制后的字符串,即 “Hello, World!”,并且程序返回0,表示正常执行结束。

需要注意的是,destination 中的内容现在与 source完全相同,但这种操作的安全性取决于目标数组足够大,以容纳源字符串的长度。

注意事项:

需要确保目标字符串足够大,以容纳源字符串的内容。

不提供目标字符串长度的选项,容易导致缓冲区溢出。

3.2 strncpy (String Copy with Size Limit)

用法:

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

功能:

将源字符串的最多前n个字符复制到目标字符串中,遇到源字符串的空字符(‘\0’)或者达到n时停止。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[10];

    strncpy(destination, source, 5);
    destination[5] = '\0';  // Ensure null-termination

    printf("Copied string: %s\n", destination);
    return 0;
}

结果:

Copied string: Hello

代码分析:

代码首先定义了两个字符数组,source 用于存储源字符串 “Hello, World!”,而 destination 则是用于存储复制后的部分字符串的目标数组。

然后,使用 strncpy 函数将源字符串的前5个字符复制到目标数组 destination 中,因此 destination 中存储的是 “Hello”。

为了确保目标数组被正确视为字符串,手动在目标数组的第6个位置添加了字符串结束符 \0。

最后,通过 printf 函数将复制后的字符串打印输出,程序正常结束。

注意事项:

需要手动确保目标字符串以空字符(‘\0’)结尾。

如果源字符串长度小于n,目标字符串将用空字符(‘\0’)填充。

对于这两个函数的具体区别,可以看我下面的这篇博客。

【c语言】strcpy()和strncpy():字符串复制详解

3.3 strcat (String Concatenate)

用法:

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

功能:

将源字符串连接到目标字符串的末尾,形成一个新的字符串。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char destination[20] = "Hello, ";
    char source[] = "World!";

    strcat(destination, source);

    printf("Concatenated string: %s\n", destination);
    return 0;
}

结果:

Concatenated string: Hello, World!

代码分析:

首先定义了一个字符数组 destination,并初始化为 "Hello, " 这个字符串,长度为20。

然后定义了另一个字符数组 source,并将其初始化为 “World!”。

接着,使用 strcat 函数将 source 中的字符串连接到 destination 的末尾,因此 destination 最终存储的是 “Hello, World!”。

最后,通过 printf 函数将连接后的字符串打印输出,程序返回0表示正常执行结束。

注意事项:

目标字符串必须足够大,以容纳两个字符串的组合。

源字符串的内容将附加到目标字符串的结尾。

3.4. strncat (String Concatenate with Size Limit)

用法:

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

功能:

将源字符串的最多前n个字符连接到目标字符串的末尾。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char destination[20] = "Hello, ";
    char source[] = "World!";

    strncat(destination, source, 3);

    printf("Concatenated string: %s\n", destination);
    return 0;
}

结果:

Concatenated string: Hello, Wor

代码分析:

这段代码的功能是将两个字符串连接起来,但是只连接源字符串的前3个字符到目标字符串末尾,并将结果打印输出。具体分析如下:

在主函数 main 中,首先定义了一个字符数组 destination,并初始化为 "Hello, " 这个字符串,长度为20。

然后定义了另一个字符数组 source,并将其初始化为 “World!”。

接着,使用 strncat 函数将 source 中的前3个字符连接到 destination 的末尾,因此 destination 最终存储的是 “Hello, Wor”。

最后,通过 printf 函数将连接后的字符串打印输出,程序返回0表示正常执行结束。

注意事项:

需要手动确保目标字符串以空字符(‘\0’)结尾。

如果源字符串长度小于n,目标字符串将用空字符(‘\0’)填充。

总体来说,这些函数是C语言中字符串操作的基本工具,但在使用时需要小心处理边界条件,以避免缓冲区溢出和其他潜在的问题。

四、字符串比较函数

字符串比较函数主要用于比较两个字符串的内容,其中最常用的函数包括 strcmp 和 strncmp。

下面是它们的详细介绍:

4.1 strcmp 函数:

strcmp 函数用于比较两个字符串的内容。

它在C标准库中声明如下:

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

str1:要比较的第一个字符串。

str2:要比较的第二个字符串。

用法:

strcmp 函数比较两个字符串的字典顺序,

如果两个字符串相等,返回值为0;

如果第一个字符串在字典中排在第二个字符串之前,返回值为负数;

如果第一个字符串在字典中排在第二个字符串之后,返回值为正数。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    int result = strcmp(str1, str2);
    if (result == 0) {
        printf("The strings are equal.\n");
    } else if (result < 0) {
        printf("%s comes before %s in dictionary order.\n", str1, str2);
    } else {
        printf("%s comes after %s in dictionary order.\n", str1, str2);
    }

    return 0;
}

结果:

 apple comes before banana in dictionary order.

代码分析:

这段代码首先定义了两个字符数组 str1 和 str2 分别存储字符串 “apple” 和 “banana”。

然后,使用 strcmp 函数比较这两个字符串的字典顺序,将比较结果存储在 result 变量中。

接着,通过条件语句判断 result 的值:

如果为0,则说明两个字符串相等,打印输出 “The strings are equal.”;

如果小于0,则说明第一个字符串在字典中排在第二个字符串之前,打印输出 “apple comes before banana in dictionary order.”;

如果大于0,则说明第一个字符串在字典中排在第二个字符串之后,打印输出 “apple comes after banana in dictionary order.”。

最后,程序返回0表示正常执行结束。

注意事项:

strcmp 函数比较的是字符串的内容,而不是字符串的地址。

对于大多数情况下,strcmp 函数足够用了。但是在一些特殊情况下(例如 处理二进制数据),可能需要使用 memcmp 函数进行比较。

4.2 strncmp 函数:

strncmp 函数与 strcmp 函数类似,但是可以指定要比较的字符数目。

它在C标准库中声明如下:

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

str1:要比较的第一个字符串。

str2:要比较的第二个字符串。

num:要比较的字符数目。

用法:

strncmp 函数比较两个字符串的前 num 个字符,如果相等,返回值为0;

如果第一个字符串在前 num 个字符中排在第二个字符串之前,返回值为负数;

如果第一个字符串在前 num 个字符中排在第二个字符串之后,返回值为正数。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple pie";
    char str2[] = "apple sauce";

    int result = strncmp(str1, str2, 5);
    if (result == 0) {
        printf("The first 5 characters of the strings are equal.\n");
    } else if (result < 0) {
        printf("The first 5 characters of %s come before %s.\n", str1, str2);
    } else {
        printf("The first 5 characters of %s come after %s.\n", str1, str2);
    }

    return 0;
}

结果:

The first 5 characters of the strings are equal.

代码分析:

这段代码首先定义了两个字符数组 str1 和 str2 分别存储字符串 “apple pie” 和 “apple sauce”。

然后,使用 strncmp 函数比较这两个字符串的前5个字符,将比较结果存储在 result 变量中。

接着,通过条件语句判断 result 的值:

如果为0,则说明这两个字符串的前5个字符相等,打印输出 “The first 5 characters of the strings are equal.”;

如果小于0,则说明在这5个字符范围内,第一个字符串在字典中排在第二个字符串之前,打印输出 “The first 5 characters of apple pie come before apple sauce.”;

如果大于0,则说明在这5个字符范围内,第一个字符串在字典中排在第二个字符串之后,打印输出 “The first 5 characters of apple pie come after apple sauce.”。

最后,程序返回0表示正常执行结束。

注意事项:

strncmp 函数用于比较指定数量的字符,因此在一些特定场景下,更灵活。

需要注意的是,如果指定的字符数超过了其中一个字符串的长度,函数将会停止在较短的字符串处,这可能会导致不符合预期的结果。

五 总结

通过本博客,读者将对C语言中字符串的基本概念、常见处理函数以及赋值、拷贝和比较等方面有更深入的理解。

熟练运用这些字符串处理函数,将有助于提高代码的可读性和效率,使开发者更加游刃有余地处理字符串操作。

希望这篇博客能够成为读者学习和掌握C语言字符串处理的有力工具。

这篇文章到这就结束啦

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是甜美的江,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

鸿蒙开发第3篇__大数据量的列表加载性能优化

列表 是最常用到的组件 一 ForEach 渲染控制语法————Foreach Foreach的作用 遍历数组项&#xff0c;并创建相同的布局组件块在组件加载时&#xff0c; 将数组内容数据全部创建对应的组件内容&#xff0c; 渲染到页面上 const swiperImage: Resource[] {$r("app.me…

Linux中FIFO管道

介绍&#xff1a; FIFO被称为命名管道&#xff0c;pipe只能用于有血缘关系的进程间通信&#xff0c;但通过FIFO&#xff0c;不相关的进程也可以进程间通信。 FIFO是linux基础文件类型的一种&#xff08;文件类型为p&#xff09;&#xff0c;FIFO文件在磁盘上没有数据块&#…

【Java八股面试系列】JVM-类和对象加载过程

目录 类和对象的加载过程 类的生命周期 类的加载过程 加载 验证 准备 解析 初始化 类卸载 对象的加载过程 类和对象的加载过程 什么是类加载和对象加载? 类加载&#xff08;Class Loading&#xff09;&#xff1a;这是指JVM在运行时将类的字节码文件加载到内存中的…

2000-2021年县域指标统计数据库

2000-2021年县域统计数据库 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;县域统计年鉴 3、范围&#xff1a;2500县 5、指标&#xff1a; 地区名称、年份、行政区域代码、所属城市、所属省份、行政区域土地面积平方公里、乡及镇个数个、乡个数个、镇个数个、街道办…

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想&#xff1a; 从头到尾依次读取中缀表达式里的每个对象&#xff0c;对不同对象按照不同的情况处理。 如果遇到空格&#xff0c;跳过如果遇到运算数字&#xff0c;直接输出如果遇到左括号&#xff0c;压栈如果遇到右括号&#xff0c;表示括号里的中缀表达式已经扫描完毕&a…

物联网和工业4.0

在当今这个快速发展的技术时代&#xff0c;物联网&#xff08;IoT&#xff09;和工业4.0成为了推动全球进入新工业时代的两大驱动力。对于刚入行的人来说&#xff0c;深入理解这两个概念及其背后的技术原理&#xff0c;对于把握未来的职业机会至关重要。 物联网&#xff0c;简…

【JavaEE】_CSS常用属性

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…

java+SSM+Mysql学院教室管理系统81671-计算机毕业设计项目选题推荐(免费领源码)

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;山西能源学院教室管理系统当然也不能排除在外。山西能源学院教室管理系统是以实际运用为开发背景&#xff0c;运用软件工…

【Web】Redis未授权访问漏洞学习笔记

目录 简介 靶机配置 Redis持久化 Redis动态修改配置 webshell 反弹shell Redis写入反弹shell任务 加固方案 简介 Redis&#xff08;Remote Dictionary Server 远程字典服务器&#xff09;是一个开源的内存数据库&#xff0c;也被称为数据结构服务器&#xff0c;它支持…

【动态规划】【数组】1416. 恢复数组

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 动态规划汇总 LeetCode1416. 恢复数组 某个程序本来应该输出一个整数数组。但是这个程序忘记输出空格了以致输出了一个数字字符串&#xff0c;我们所知道的信息只有&#xff1a;…

C++初阶:容器(Containers)list常用接口详解

介绍完了vector类的相关内容后&#xff0c;接下来进入新的篇章&#xff0c;容器list介绍&#xff1a; 文章目录 1.list的初步介绍2.list的定义&#xff08;constructor&#xff09;3.list迭代器&#xff08; iterator &#xff09;4.string的三种遍历4.1迭代器4.2范围for循环 5…

随机过程及应用学习笔记(二)随机过程的基本概念

随机过程论就是研究随时间变化的动态系统中随机现象的统计规律的一门数学学科。 目录 前言 一、随机过程的定义及分类 1、定义 2、分类 二、随机过程的分布及其数字特征 1、分布函数 2、数字特征 均值函数和方差函数 协方差函数和相关函数 3、互协方差函数与互相关函…

Java 基于 SpringBoot 的大药房管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

图表自动化开篇

目录 前言&#xff1a; 使用 Canvas 或者 SVG 渲染 选择哪种渲染器 代码触发 ECharts 中组件的行为 前言&#xff1a; 图表自动化一直以来是自动化测试中的痛点&#xff0c;也是难点&#xff0c;痛点在于目前越来越多公司开始构建自己的BI报表平台但是没有合适的自动化测试…

SHA-512在Go中的实战应用: 性能优化和安全最佳实践

SHA-512在Go中的实战应用: 性能优化和安全最佳实践 简介深入理解SHA-512算法SHA-512的工作原理安全性分析SHA-512与SHA-256的比较结论 实际案例分析数据完整性验证用户密码存储数字签名总结 性能优化技巧1. 利用并发处理2. 避免不必要的内存分配3. 适当的数据块大小总结 与其他…

一、Docker/安装包部署ClickHouse

Docker/安装包部署ClickHouse 一、docker部署1.安装Docker2.拉取ClickHouse镜像2.1 选择拉取版本2.2 拉取镜像 3.启动ClickHouse3.1 确定好挂载目录3.2 测试环境3.3 生产环境3.1.1 获取配置文件3.1.2 配置文件中添加用户3.1.3 启动容器 4.使用DBeaver连接 二、安装包安装1.准备…

Netty应用——通过WebSocket编程实现服务器和客户端长连接(十八)

Http协议是无状态的&#xff0c;浏览器和服务器间的请求响应一次&#xff0c;下一次会重新创建连接要求:实现基于webSocket的长连接的全双工的交互改变Http协议多次请求的约束&#xff0c;实现长连接了&#xff0c; 服务器可以发送消息给浏览器客户端浏览器和服务器端会相互感知…

【Linux】进程基础铺垫(一)硬件基础:冯诺依曼体结构

冯诺依曼体结构 一、体系结构&#xff08;硬件上&#xff09;—— 冯诺依曼体系结构二、内存 的引入&#xff1a;为什么在体系结构中要存在内存? ?前言&#xff1a;内存背景 三、在体系结构中 存在内存的原因 以及 内存的意义 一、体系结构&#xff08;硬件上&#xff09;——…

【ES】--Elasticsearch的分词器深度研究

目录 一、问题描述及分析二、analyze分析器原理三、 multi-fields字段支持多场景搜索(如同时简繁体、拼音等)1、ts_match_analyzer配置分词2、ts_match_all_analyzer配置分词3、ts_match_1_analyzer配置分词4、ts_match_2_analyzer配置分词5、ts_match_3_analyzer配置分词6、ts…

腾讯云游戏服务器配置有哪些?

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…