【021】C/C++字符串处理函数

news2024/11/28 0:42:12

C/C++字符串处理函数

  • 引言
  • 一、字符串操作函数
    • 1.1、测量字符串的长度strlen
    • 1.2、字符串拷贝函数strcpy
    • 1.3、字符串追加函数strcat
    • 1.4、字符串比较函数strcmp
  • 二、字符串查找函数
    • 2.1、字符串查找字符函数strchr
    • 2.2、字符串查找子串函数strstr
  • 三、其他字符串处理函数
    • 3.1、字符串分割函数strtok
    • 3.2、格式化的数据写入字符串--sprintf
    • 3.3、读取格式化的数据函数--sscanf
  • 总结

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【020】C++的动态内存申请new和delete

一、字符串操作函数

头文件:< string.h >
以str开头的是字符串处理函数,默认遇到’\0’结束操作。

1.1、测量字符串的长度strlen

strlen函数是一个C标准库函数,用于计算字符串的长度(不包括结束符\0)。它的原型定义在string.h头文件中:

size_t strlen(const char *s);

其中,参数s是需要计算长度的字符串的首元素地址,返回值为该字符串的长度。

举个例子:

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

int main() {
    char str[] = "Hello, world!";
    printf("The length of '%s' is %d.\n", str, strlen(str));
    char str2[] = "Hel\0lo, world!";
    printf("The length of '%s' is %d.\n", str2, strlen(str2));
    return 0;
}

输出结果:

The length of 'Hello, world!' is 13.
The length of 'Hel' is 3.

注意:strlen函数只能用于以null字符’\0’结尾的字符串。如果传递给它一个非空字符数组或者指针,但是没有以’\0’结尾,那么它可能会一直扫描内存直到遇到一个’\0’为止,这将导致不可预测行为和内存访问错误。

1.2、字符串拷贝函数strcpy

strcpy函数是一个C标准库函数,用于将一个字符串复制到另一个字符串中。它的原型定义在string.h头文件中:

char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

其中,参数dest是目标字符串(也就是要拷贝到的字符串),src是源字符串(也就是要被拷贝的字符串),n是要拷贝的最大字节数(如果遇到’\0’会自动结束)。返回值为指向目标字符串的指针。

举个例子:

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

int main() {
    char src[] = "Hello, world!";
    char dest[20];
    strcpy(dest, src);
    printf("The copied string is: '%s'\n", dest);
    return 0;
}

输出结果:

The copied string is: 'Hello, world!'

需要注意的一点是,在使用strcpy函数时,目标字符数组必须足够大以容纳源字符数组的内容及结尾符号’\0’,否则会发生缓冲区溢出和未定义行为问题。

strcpy和strncpy都是C语言字符串拷贝函数,用于将一个字符串复制到另一个字符串中。它们的区别在于:

  1. 参数类型不同:strcpy的第一个参数是char *dest,第二个参数是const char *src;而strncpy的第一个参数也是char *dest,但第二个参数是const char *src,并且有一个额外的int参数n表示要拷贝的最大字符数。
  2. 处理方式不同:strcpy会将源字符串全部拷贝到目标字符串中,并在目标字符串末尾添加’\0’结尾符;而strncpy则只会拷贝源字符串中前n个字符(不包括’\0’),如果源字符串长度小于n,则剩余部分用’\0’填充。

因此,在使用这两个函数时需要根据具体需求选择合适的函数。如果需要完整地复制源字符串,可以使用strcpy;如果需要只复制源字符串前几个字符并控制拷贝长度,可以使用strncpy。

下面给出一个示例代码:

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

int main() {
    char src[] = "Hello, world!";
    char dest1[20];
    char dest2[10];
    
    // 使用strcpy将src复制到dest1
    strcpy(dest1, src);
    printf("The copied string using strcpy is: '%s'\n", dest1);
    
    // 使用strncpy将src前6个字符复制到dest2
    strncpy(dest2, src, 6);
    dest2[6] = '\0'; // 手动添加结尾符号
    printf("The copied string using strncpy is: '%s'\n", dest2);
    
    return 0;
}

输出结果:

The copied string using strcpy is: 'Hello, world!'
The copied string using strncpy is: 'Hello'

1.3、字符串追加函数strcat

strcat和strncat都是C语言中的字符串追加函数,用于将源字符串追加到目标字符串的末尾。

它们的原型分别为:

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

其中,dest表示目标字符串,src表示源字符串,n表示要复制的字符数。两个函数都会返回一个指向目标字符串的指针。

使用strcat时需要注意以下几点:

  1. 目标字符串必须有足够的空间来容纳源字符串和结尾符’\0’。
  2. 源字符串不会被修改,只有目标字符串会发生变化。
  3. 如果源字符串以’\0’结尾,则追加过程中会把’\0’一起复制到目标串中;如果没有’\0’结尾,则结果未定义。

使用strncat时需要注意以下几点:

  1. 目标字符串必须有足够的空间来容纳源字符串前n个字符和结尾符’\0’。
  2. 如果源字符串长度小于n,则只会复制整个源串,并在其后添加’\0’。
  3. 如果源字符串长度大于等于n,则只会复制前n个字符,并在其后添加’\0’。

示例代码:

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

int main() {
    char str1[20] = "Hello, ";
    char str2[] = "world!";
    
    // 使用strcat将str2追加到str1末尾
    strcat(str1, str2);
    
    printf("The concatenated string is: '%s'\n", str1);
    
    char str3[20] = "Hello, ";
    char str4[] = "world!";
    
    // 使用strncat将str4的前5个字符追加到str3末尾
    strncat(str3, str4, 5);
    
    printf("The concatenated string is: '%s'\n", str3);
    
    return 0;
}

输出结果:

The concatenated string is: 'Hello, world!'
The concatenated string is: 'Hello, world'

1.4、字符串比较函数strcmp

strcmp和strncmp都是C语言中的字符串比较函数,用于比较两个字符串是否相等。

它们的原型分别为:

int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);

其中,s1和s2分别表示要比较的两个字符串,n表示要比较的字符数。两个函数都会返回一个整数值,代表比较结果。如果返回值为0,则表示两个字符串相等;如果返回值小于0,则表示第一个不同字符在s1中出现的位置小于在s2中出现的位置;如果返回值大于0,则表示第一个不同字符在s1中出现的位置大于在s2中出现的位置。

使用strcmp时需要注意以下几点:

  1. 该函数会一直比较下去,直到找到不同或者遇到’\0’。
  2. 如果两个字符串完全相同,则该函数返回0。
  3. 如果第一个不同字符在s1中出现的位置小于在s2中出现的位置,则该函数返回负数;反之则返回正数。

使用strncmp时需要注意以下几点:

  1. 该函数只会比较前n个字符。
  2. 如果前n个字符完全相同,则该函数返回0。
  3. 如果第一个不同字符在s1中出现的位置小于在s2中出现的位置,则该函数返回负数;反之则返回正数。

示例代码:

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

int main() {
    char str1[] = "Hello, world!";
    char str2[] = "hello, World!";
    
    // 使用strcmp比较str1和str2是否相等
    if (strcmp(str1, str2) == 0) {
        printf("The strings are equal.\n");
    } else {
        printf("The strings are not equal.\n");
    }
    
    char str3[] = "Hello, world!";
    char str4[] = "hello, World!";
    
    // 使用strncmp比较str3和str4的前5个字符是否相等
    if (strncmp(str3, str4, 5) == 0) {
        printf("The first 5 characters of the strings are equal.\n");
    } else {
        printf("The first 5 characters of the strings are not equal.\n");
    }
    
    return 0;
}

输出结果:

The strings are not equal.
The first 5 characters of the strings are equal.

二、字符串查找函数

2.1、字符串查找字符函数strchr

在C语言中,strchr函数用于查找某个字符在字符串中第一次出现的位置,并返回该位置指针。其函数原型为:

char *strchr(const char *s, int c);

其中,s是待查找的字符串,c是要查找的字符。如果在字符串s中找到了字符c,则返回该字符在字符串s中第一次出现的位置指针;如果没有找到,则返回NULL。

例如:

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

int main() {
    char str[] = "hello world";
    char *ptr = strchr(str, 'l');
    if (ptr != NULL) {
        printf("The first occurrence of 'l' in '%s' is at position %ld.\n", str, ptr - str + 1);
    } else {
        printf("The character 'l' is not found in '%s'.\n", str);
    }
    return 0;
}

上述代码输出结果为:

The first occurrence of 'l' in 'hello world' is at position 3. 

表示字符’l’第一次出现在字符串"hello world"的第3个位置(从1开始计数)。

2.2、字符串查找子串函数strstr

在C语言中,strstr函数用于查找某个子串在字符串中第一次出现的位置,并返回该位置指针。其函数原型为:

char *strstr(const char *haystack, const char *needle);

其中,haystack是待查找的字符串,needle是要查找的子串。如果在字符串haystack中找到了子串needle,则返回该子串在字符串haystack中第一次出现的位置指针;如果没有找到,则返回NULL。

例如:

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

int main() {
    char str[] = "hello world";
    char sub[] = "world";
    char *ptr = strstr(str, sub);
    if (ptr != NULL) {
        printf("The first occurrence of '%s' in '%s' is at position %ld.\n", sub, str, ptr - str + 1);
    } else {
        printf("The substring '%s' is not found in '%s'.\n", sub, str);
    }
    return 0;
}

上述代码输出结果为:

The first occurrence of 'world' in 'hello world' is at position 7. 

表示子串"world"第一次出现在字符串"hello world"的第7个位置(从1开始计数)。

三、其他字符串处理函数

3.1、字符串分割函数strtok

在C语言中,strtok函数用于分割字符串为多个子串。它的原型为:

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

其中,参数str是要被分割的字符串,参数delim是一个包含所有可能作为分隔符的字符集合(即分隔符列表)。该函数返回值为指向下一个被分割出来的子串的指针。

例如:

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

int main() {
    char str[] = "apple,banana,cherry,date";
    char *ptr = strtok(str, ",");
    while (ptr != NULL) {
        printf("%s\n", ptr);
        ptr = strtok(NULL, ",");
    }
    return 0;
}

上述代码输出结果为:

apple
banana
cherry
date

表示将字符串"apple,banana,cherry,date"按照逗号进行分割,并输出各个子串。

3.2、格式化的数据写入字符串–sprintf

在C语言中,sprintf函数用于将格式化的数据写入字符串中。它的原型为:

int sprintf(char *str, const char *format, ...);

其中,参数str是一个指向要写入数据的字符数组的指针,参数format是一个包含格式化占位符(如%d、%f等)的字符串,后面可跟多个与占位符相对应的实际值。

该函数返回值为成功写入到字符数组中的字符数(不包括末尾的空字符),如果发生错误则返回负值。

例如:

#include <stdio.h>

int main() {
    char str[100];
    int n = 123;
    float f = 3.14;
    sprintf(str, "n=%d, f=%.2f", n, f);
    printf("%s\n", str);
    return 0;
}

上述代码输出结果为:

n=123, f=3.14

表示将整数变量n和浮点数变量f按照指定格式输出,并将结果写入到字符串str中。

3.3、读取格式化的数据函数–sscanf

在C语言中,sscanf函数用于从一个字符串中读取格式化的数据。它的原型为:

int sscanf(const char *str, const char *format, ...);

其中,参数str是一个指向要读取数据的字符数组的指针,参数format是一个包含格式化占位符(如%d、%f等)的字符串,后面可跟多个与占位符相对应的实际值。

该函数返回值为成功读取到的参数数量(如果有错误,则返回已经成功读取的数量),如果发生错误则返回负值。

例如:

#include <stdio.h>

int main() {
    char str[] = "n=123, f=3.14";
    int n;
    float f;
    sscanf(str, "n=%d, f=%f", &n, &f);
    printf("n=%d, f=%.2f\n", n, f);
    return 0;
}

上述代码输出结果为:

n=123, f=3.14

表示从字符串str中按照指定格式读取整数变量n和浮点数变量f,并将它们输出到屏幕上。

总结

C语言中常用的字符串处理函数有以下几个:

  1. strlen:计算字符串的长度,即字符数组中不包括’\0’字符的字符数。
  2. strcpy:将一个字符串复制到另一个字符串中,包括’\0’在内。
  3. strncpy:将一个字符串的前n个字符复制到另一个字符串中,如果源字符串长度小于n,则会在末尾加上’\0’。
  4. strcat:将两个字符串连接起来,即将第二个字符串拼接到第一个字符串后面,并在末尾添加’\0’。
  5. strncat:将两个字符串的前n个字符连接起来,如果源字符串长度小于n,则会在末尾添加’\0’。
  6. strcmp:比较两个字符串是否相等,返回值为0表示相等。
  7. strncmp:比较两个字符串的前n个字符是否相等,返回值为0表示相等。
  8. strchr:查找某个字符在字符串中第一次出现的位置,并返回该位置指针。
  9. strstr:查找某个子串在主串中第一次出现的位置,并返回该位置指针。

除了以上这些常用函数外,还有其他一些函数如strtok、sprintf、sscanf、memset、memcpy等都属于C语言中常用的字符串处理函数。

在这里插入图片描述

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

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

相关文章

结构型设计模式04-适配器模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 适配器模式 1、适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计…

chatgpt赋能python:用Python实现文本数字转换:从123到一二三

用Python实现文本数字转换&#xff1a;从123到一二三 在网站开发中&#xff0c;我们经常需要将数字转换成文字&#xff0c;比如将123转成“一百二十三”。这种数字转文字的需求&#xff0c;既方便了用户的阅读&#xff0c;也提高了网站的可读性和SEO效果。 在本文中&#xff…

定时任务原理方案综述 | 京东云技术团队

本文主要介绍目前存在的定时任务处理解决方案。业务系统中存在众多的任务需要定时或定期执行&#xff0c;并且针对不同的系统架构也需要提供不同的解决方案。京东内部也提供了众多定时任务中间件来支持&#xff0c;总结当前各种定时任务原理&#xff0c;从定时任务基础原理、单…

excel中的vlookup函数使用,查找对应信息

简单做一个小表格&#xff0c;第一列序号、第二列姓名、第三列数值 显然我这里都乱序了&#xff0c;是为了更好的展示 vlookup函数是查找函数的一种&#xff0c;有四个参数&#xff1a; VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) lookup_value&#xf…

【算法与数据结构】206、LeetCode 反转链表

文章目录 一、题目二、翻转链表双指针法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、翻转链表双指针法 思路分析&#xff1a;代码首先进行头结点合法性判断&#xff0c;如果是空链表或者仅有一个节点的链…

SpringBoot + minio实现分片上传、秒传、续传

什么是minio MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议&#xff0c;项目地址是https://github.com/minio/minio。 引用官网&#xff1a; MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容…

SpringBoot SpEL表达式(五十二)

当死亡笼罩在脑海&#xff0c;请用生的信念打败它 上一章简单介绍了SpringBoot 事件监听处理(五十一), 如果没有看过,请观看上一章 一. 解析器 我们在生活中&#xff0c;常常会用到表达式计算&#xff0c; 如 传入一个字符串 abcd, 然后指定 a,b,c,d 的值。 让其计算出最后的…

2023年律师事务所研究报告

第一章 行业概况 律师事务所行业是一个关键的法律服务提供者&#xff0c;为客户提供各种法律咨询、代理和解决纠纷的服务。律师事务所是由一群经验丰富的律师和法律专业人员组成的机构&#xff0c;他们具备广泛的法律知识和专业技能。 律师事务所在各个领域都扮演着重要的角色…

信捷PLC中A_PLSF指令的加减速时间设置简析

我们在使用信捷PLC通过ethercat总线控制伺服驱动器时,可能会需要用到其用于轴控制的指令: A_PLSF,即“可变速度输出”。 这个指令的特点是运行过程中,速度可以实时改变,实时生效,不需要重新触发。 既然是速度指令,肯定需要设置加减速时间,因为根据实际负载的不同,使用…

30分钟Cadence原理图入门

新建工程 点击Design Entry CIS图标&#xff0c;选择OrCAD Capture。 新建工程File->New->Project 设置工程名字和路径。 默认生成PAGE1 新建页 右键点击SCHEMATIC1->New Page&#xff0c;新建原理图页。 页面设置 修改原理图页大小 选择大小A、B、C、D、E或自定义…

uniapp与webview网页交互打开手机扫码

公司的uniapp项目有一个专门打开网页的功能&#xff0c;uniapp通过webview去打开对应的url&#xff0c;然后通过监听webview网页发送过来的事件&#xff0c;在uniapp手机端打开手机的扫码功能&#xff0c;然后将扫码识别到的结果传回给网页。 思路 1.网页引入uni.webview.js文…

【HTML】【一文全解Canvas】从初学到实战,彻底掌握前端绘图神器!

【HTML】Canvas 基本介绍与应用 前言一、Canvas 概述二、在 HTML 中使用 Canvas三、Canvas 绘制图形1、绘制矩形a. fillRect()b. strokeRect() 2、绘制圆形a. 绘制实心圆形b. 绘制空心圆形 四、Canvas 绘制文本1、 fillText()2、 strokeText() 五、Canvas 绘制图片1、drawImage…

vue中安装使用Mock来模拟数据(详细教程)

在做前后分离的项目时候&#xff0c;比如制作VUE项目&#xff0c;很多时候后端没有提供接口&#xff0c;前端人员可以自己通过mock来造一个接口&#xff0c;返回数据 操作步骤 1&#xff09; 安装mockjs和axios&#xff1a; npm install mockjs -S npm install axios -S &…

怎么翻译文档?翻译文档的方法你知道几种?

文档翻译在现代社会中已经成为一项重要的工作&#xff0c;随着全球化的加速和跨境交流的增多&#xff0c;越来越多的公司和组织需要将自己的文件、资料等内容进行翻译&#xff0c;以便更好地与国际市场接轨。而如何进行高质量的文档翻译&#xff0c;一直是许多人所关注的问题。…

webstorm+小程序相配合来开发小程序

前言&#xff1a; webstorm可以安装的一个小程序插件&#xff1a; wechat-miniprogram-plugin &#xff0c;来实现小程序语法的高亮&#xff0c;并识别 rpx 这种小程序专有单位&#xff0c;还可以实现跟开发者工具中一些类似的操作功能。 注意事项&#xff1a; 1、小程序的根目…

使用 javascript 将鼠标指针移动到特定位置

文章目录 使用一些 CSS 样式创建基本的 HTML 结构使用 JavaScript 将鼠标指针移动到特定位置总结 请注意 &#xff0c;无法将鼠标指针移动到 JavaScript 中的特定位置。 主要原因是它会给用户带来安全问题并损害用户体验。 在这篇文章中&#xff0c;我们将创建一个假的或自定义…

华为OD机试真题 Java 实现【字符串加密】【2023Q1 100分】,附详细解题思路

一、题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加…

计算机网络管理-实验5-安装试用SNMPc网络管理软件

一、实验目的 学习SNMPc网络管理软件安装&#xff0c;初步了解其使用方法&#xff0c;对比常用网管软件的特点。 二、实验内容与设计思想 实验内容&#xff1a;编写代码&#xff0c;测试 1. 安装与配置SNMPc网络管理软件&#xff08;安装使用方法参见教材第6章&#xff09;…

自主可控!搭载龙芯二号,飞凌嵌入式FET-2K0500-C核心板发布

作为国内领先的信息技术核心产品研发企业&#xff0c;龙芯中科致力于打造自主开放的软硬件生态和信息产业体系&#xff0c;为国家战略需求提供自主、安全、可靠的处理器。现在&#xff0c;飞凌嵌入式与龙芯中科强强联手&#xff0c;共同推出FET-2K0500-C核心板&#xff01; 飞…

接口耗时2000多秒!我人麻了!

接口耗时2000多秒&#xff01;我人麻了&#xff01; 前几天早上&#xff0c;有个push服务不断报警&#xff0c;报了很多次&#xff0c;每次都得运维同学重启服务来维持&#xff0c;因为这个是我负责的&#xff0c;所以我顿时紧张了起来&#xff0c;匆忙来到公司&#xff0c;早饭…