C++语言学习(四)—— 字符串处理函数

目录

一、字符串处理函数

1.1 输入字符串函数 scanf_s函数和get_s函数

1.2 字符串长度计算函数 strlen

1.3 字符串复制函数 strcpy_s

1.4 字符串连接函数 strcat_s

1.5 字符串比较函数 strcmp

1.6 其他字符串处理函数


一、字符串处理函数

在C++中,字符串是一串字符的序列。C++标准库提供了许多用于处理字符串的函数,可以方便地对字符串进行各种操作。

1.1 输入字符串函数 scanf_s函数和get_s函数

在C++中,scanf_s函数和gets_s函数是用于输入字符串的函数。然而,它们是C语言标准库函数的安全版本,C++推荐使用更为安全和强大的C++标准库函数来处理字符串输入。

  1. scanf_s函数: scanf_s函数被用于从标准输入(如键盘)读取格式化输入,包括字符串。与scanf函数相比,scanf_s函数要求提供额外的参数来指定输入字符串的最大长度,以防止缓冲区溢出的安全问题。函数原型如下:

    int scanf_s(const char* format, ...);
    

    示例代码:

    char str[100];
    scanf_s("%s", str, 100);
    
  2. gets_s函数: gets_s函数用于从标准输入读取一行字符串,包括空格和制表符,并将其存储在缓冲区中。与gets函数相比,gets_s函数要求提供额外参数来指定输入缓冲区的大小,以防止缓冲区溢出的安全问题。函数原型如下:

    char* gets_s(char* str, rsize_t len);
    

    示例代码:

    char str[100];
    gets_s(str, 100);
    

注意:

        使用这些函数时,需要包含#include <cstdio>头文件。

C++标准库提供了更好的替代函数,如std::cinstd::getline,它们提供了更安全和方便的方法来处理字符串输入。

例如:

#include <iostream>
#include <string>int main() {std::string str;std::cin >> str; // 读取字符串std::getline(std::cin, str); // 读取整行字符串return 0;
}

1.2 字符串长度计算函数 strlen

在C++中,可以使用标准库函数 strlen 来计算字符串的长度。strlen 函数返回一个 size_t 类型的值,表示字符串的长度,即字符串中非空字符的数量(不包括字符串末尾的空字符 \0)。

函数原型如下:

size_t strlen(const char* str);

使用示例:

#include <iostream>
#include <cstring>int main() {const char* str = "Hello, World!";size_t len = strlen(str);std::cout << "字符串长度为: " << len << std::endl;return 0;
}

输出结果:

字符串长度为: 13

注意:

   strlen 函数只能用于计算以空字符 \0 结尾的字符数组(C风格字符串)的长度。如果字符串没有以空字符结尾,那么 strlen 函数将无法正确计算长度,可能会导致程序错误。

在 C++ 中,更推荐使用 std::string 类型和其成员函数 length 来处理字符串,在不需要和 C 风格字符串进行交互的情况下更加安全和便捷。例如:

#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";size_t len = str.length();std::cout << "字符串长度为: " << len << std::endl;return 0;
}

1.3 字符串复制函数 strcpy_s

strcpy_s 是 C++ 中的一个字符串复制函数,用于将一个字符串复制到另一个字符串中,包括字符串末尾的空字符 \0。该函数是安全的,可以避免缓冲区溢出的问题。

函数原型如下:

errno_t strcpy_s(char* dest, rsize_t destSize, const char* src);
  • dest:目标字符串的指针,用于存储复制后的字符串。
  • destSize:目标字符串 dest 的大小,即缓冲区的大小。
  • src:源字符串的指针,要被复制的字符串。

strcpy_s 的返回值为一个 errno_t 类型的错误码,用来指示函数执行是否成功。若复制成功,则返回0;若 dest src 为空指针,或者 destSize 为0,或者复制过程中存在缓冲区溢出的风险,则返回相应的错误码。

使用示例:

#include <iostream>
#include <cstring>int main() {const char* src = "Hello, World!";char dest[20];errno_t err = strcpy_s(dest, sizeof(dest), src);if (err == 0) {std::cout << "字符串复制成功:" << dest << std::endl;} else {std::cout << "字符串复制失败,错误码:" << err << std::endl;}return 0;
}

输出结果:

字符串复制成功:Hello, World!

注意:

        在使用 strcpy_s 函数时,需要确保目标字符串 dest 的大小能够容纳源字符串 src 和结尾的空字符 \0。否则,会发生缓冲区溢出,导致未定义的行为。

在 C++ 中,更推荐使用 std::string 类型和其成员函数 assign operator= 来进行字符串复制,这样可以更好地避免缓冲区溢出的问题,并且更加安全和方便。例如:

#include <iostream>
#include <string>int main() {std::string src = "Hello, World!";std::string dest;dest.assign(src);std::cout << "字符串复制成功:" << dest << std::endl;return 0;
}

std::string 类型会自动管理字符串的长度和内存分配,无需手动处理缓冲区的大小,可以更好地适应 C++ 中的字符串处理。

1.4 字符串连接函数 strcat_s

strcat_s 是 C++ 中的一个字符串连接函数,用于将一个字符串连接到另一个字符串的末尾。该函数是安全的,可以避免缓冲区溢出的问题。

函数原型如下:

errno_t strcat_s(char* dest, rsize_t destSize, const char* src);
  • dest:目标字符串的指针,用于存储连接后的字符串。
  • destSize:目标字符串 dest 的大小,即缓冲区的大小。
  • src:源字符串的指针,要被连接到目标字符串末尾的字符串。

strcat_s 的返回值为一个 errno_t 类型的错误码,用来指示函数执行是否成功。若连接成功,则返回0;若 dest src 为空指针,或者 destSize 为0,或者连接过程中存在缓冲区溢出的风险,则返回相应的错误码。

使用示例:

#include <iostream>
#include <cstring>int main() {const char* src = ", World!";char dest[20] = "Hello";errno_t err = strcat_s(dest, sizeof(dest), src);if (err == 0) {std::cout << "字符串连接成功:" << dest << std::endl;} else {std::cout << "字符串连接失败,错误码:" << err << std::endl;}return 0;
}

输出结果:

字符串连接成功:Hello, World!

注意:

        在使用 strcat_s 函数时,需要确保目标字符串 dest 的大小能够容纳源字符串 src、目标字符串 dest 和结尾的空字符 \0。否则,会发生缓冲区溢出,导致未定义的行为。

在 C++ 中,更推荐使用 std::string 类型和其成员函数 append operator+= 来进行字符串连接,这样可以更好地避免缓冲区溢出的问题,并且更加安全和方便。例如:

#include <iostream>
#include <string>int main() {std::string src = ", World!";std::string dest = "Hello";dest.append(src);std::cout << "字符串连接成功:" << dest << std::endl;return 0;
}

1.5 字符串比较函数 strcmp

strcmp 是 C++ 中的一个字符串比较函数,用于比较两个字符串的大小(字典序)。该函数比较的是字符串的字符内容,而不是字符串的内存地址。

函数原型如下:

int strcmp(const char* str1, const char* str2);
  • str1:第一个待比较的字符串。
  • str2:第二个待比较的字符串。

strcmp 的返回值为一个整数,表示两个字符串的比较结果:

  • str1 小于 str2,则返回一个小于 0 的值。
  • str1 等于 str2,则返回 0。
  • str1 大于 str2,则返回一个大于 0 的值。

使用示例:

#include <iostream>
#include <cstring>int main() {const char* str1 = "abc";const char* str2 = "def";int result = strcmp(str1, str2);if (result < 0) {std::cout << "str1 小于 str2" << std::endl;} else if (result == 0) {std::cout << "str1 等于 str2" << std::endl;} else {std::cout << "str1 大于 str2" << std::endl;}return 0;
}

输出结果:

str1 小于 str2

注意:

在使用 strcmp 进行字符串比较时,需要注意两个字符串的长度和内容是否相同,以避免出现错误的比较结果。

在 C++ 中,更推荐使用 std::string 类型和其成员函数 compare 来进行字符串比较,这样可以更好地处理字符串的长度和内容,并且更加方便和安全。例如:

#include <iostream>
#include <string>int main() {std::string str1 = "abc";std::string str2 = "def";int result = str1.compare(str2);if (result < 0) {std::cout << "str1 小于 str2" << std::endl;} else if (result == 0) {std::cout << "str1 等于 str2" << std::endl;} else {std::cout << "str1 大于 str2" << std::endl;}return 0;
}

1.6 其他字符串处理函数

函数名描述
strncat连接指定长度的字符串
strncmp比较指定长度的字符串
strchr在字符串中查找指定字符
strrchr在字符串中反向查找指定字符
strstr在字符串中查找子字符串
strtok分割字符串
sprintf格式化字符串
atoi字符串转整数
atof字符串转浮点数
strtok_s安全版本的分割字符串函数
strcpy_s安全版本的复制字符串函数
strcat_s安全版本的连接字符串函数
sprintf_s安全版本的格式化字符串函数
wcslen计算宽字符串长度
wcscpy复制宽字符串
wcsncpy复制指定长度的宽字符串
wcscat连接宽字符串
wcsncat连接指定长度的宽字符串
wcscmp比较宽字符串
wcsncmp比较指定长度的宽字符串
wcschr在宽字符串中查找指定字符
wcsrchr在宽字符串中反向查找指定字符
wcsstr在宽字符串中查找子字符串
wcstok分割宽字符串
swprintf格式化宽字符串
_wtoi宽字符串转整数
_wtof宽字符串转浮点数
_wtoi64宽字符串转64位整数
wcstok_s安全版本的分割宽字符串函数
wcscpy_s安全版本的复制宽字符串函数
wcscat_s安全版本的连接宽字符串函数
swprintf_s安全版本的格式化宽字符串函数
string::size返回字符串的大小
string::length返回字符串的长度
string::c_str返回以null结尾的字符数组
string::substr返回指定位置开始的子字符串
string::find在字符串中查找指定子字符串
string::rfind在字符串中反向查找指定子字符串
string::replace替换字符串中的子字符串

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

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

相关文章

算法中的二阶差分

众所周知&#xff0c;在往区间的每一个数都加上一个相同的数k&#xff0c;进行n次后会得到一个新的数列&#xff0c;如果每次加都循环区间挨个数加上k&#xff0c;这样时间复杂度无疑是O(n^2)&#xff0c;很高。这时可以采用一阶差分就可解决&#xff0c;这里默认会一阶差分&am…

k8s的ca以及相关证书签发流程

k8s的ca以及相关证书签发流程 1. kube-apiserver相关证书说明2. 生成CA凭证1.1. 生成CA私钥1.2. 生成CA证书 2. 生成kube-apiserver凭证2.1. 生成kube-apiserver私钥2.2. 生成kube-apiserver证书请求2.3. 生成kube-apiserver证书 3. 疑问和思考4. 参考文档 对于网站类的应用&am…

3d挤压出的模型怎么设置分段---模大狮模型网

在3D建模软件中&#xff0c;挤压(Extrude)是常见的操作&#xff0c;而设置分段(Segments)可以让您控制挤压后模型的细节和曲线。以下是一般情况下在常见的3D建模软件(例如Blender、Maya、3ds Max等)中设置挤压模型的分段的方法&#xff1a; Blender中设置挤压模型的分段&#x…

麻了,一面就这么难

总体而言&#xff0c;整个过程更看你回答的条理与深度&#xff0c;不太需要面面俱到&#xff0c;有自己的理解和思考反而会加分&#xff0c;不需要每道题都回答得百分百&#xff0c;有些问题属于面试官顺带提一嘴&#xff0c;但重点问题要答好。 一面 介绍下项目&#xff0c;因…

深入探索MySQL:成本模型解析与查询性能优化

码到三十五 &#xff1a; 个人主页 在数据库管理系统中&#xff0c;查询优化器是一个至关重要的组件&#xff0c;它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中&#xff0c;查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣&#xff0c;并选择…

高性价比国产安全MCU-LKT6850

LKT6850是一款以32位ARMCortexTM -M0处理器内核为基础的高性价比安全MCU。LKT6850具有最高64KBFlash、4KBRAM、48MHZ工作频率&#xff0c;具有丰富的外设资源供开发人员使用。芯片可实现DES/3DES/AES/SM4等对称算法&#xff0c;可实现多种安全身份认证、数据加解密等功能。该产…

Linux C++ 024-STL初识

Linux C 024-STL初识 vector 本节关键字&#xff1a;Linux、C、STL初始、迭代器、vector 相关库函数&#xff1a;for_each、push_back STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西。c的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升。…

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

Port模块配置详解 前言一、如何添加Port模块?1.1 导入Port模块二、Port模块详细配置说明2.1 Port模块问题解决2.2 Port模块配置步骤2.2.1 数据手册查找Port对应的Group2.2.2 配置Port为CAN功能2.2.3 选择芯片型号总结前言 我们还差一个Port模块进行配置io的复用功能选择。就是…

我们常说的443端口是指的什么?

443端口是网页浏览端口&#xff0c;主要用于HTTPS服务&#xff0c;是提供加密和通过安全端口传输的另一种HTTP。在一些对安全性要求较高的网站&#xff0c;比如银行、购物、金融等行业都会采用HTTPS服务&#xff0c;能够保障用户资金和交易的安全性。443端口在我们日常生活中被…

怎样恢复已删除的照片?教你3个方法,一键恢复!

很多人喜欢以拍照的形式记录生活&#xff0c;手机里的照片就很容易堆积成山&#xff0c;但当内存不够用时就不得不选择删除。可是这些美好的照片始终是很多人心中抹不去的记忆&#xff0c;那么该怎样恢复已删除的照片呢&#xff1f;下面几招&#xff0c;教你一键恢复&#xff0…

pyqt5 QImage QPixmap Opencv图像 相互转换

目录 1. Opencv图像 转 QImage2. Opencv图像 转 QPixmap3. QImage 转 Opencv图像4. QPixmap 转 opencv图像5. QPixmap 转 QImage6. QImage 转 QPixmap 1. Opencv图像 转 QImage def cvimage_to_qimage(cvimage): image cv2.cvtColor(cvimage, cv2.COLOR_BGR2RGB)qimage QIm…

求KMP的算法

求KMP的算法### 求next数组方法&#xff1a; 首先求每个子串的最长前后缀 1、next 数组的定义 next 数组&#xff08;前缀表&#xff09;是在 KMP 算法中使用到的&#xff0c;用于匹配模式串相同前后缀长度 它可以减少匹配次数&#xff0c;其原理是将模式串中每个子串的相同…

吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.1-12.3

目录 第 7 周 12、 支持向量机(Support Vector Machines)12.1 优化目标 第 7 周 12、 支持向量机(Support Vector Machines) 12.1 优化目标 到目前为止,你已经见过一系列不同的学习算法。在监督学习中&#xff0c;许多学习算法的性能都非常类似&#xff0c;因此&#xff0c;重…

[计算机知识] TCP/IP网络模型、MySQL的结构

TCP/IP网络模型 应用层 给用户提供应用功能&#xff0c;如HTTP, DNS 应用层处于用户态&#xff0c;传输层及以下处于内核态 传输层 给应用层提供网络支持&#xff0c;如TCP, UDP TCP提供稳定、面向连接的网络传输协议 应用层的数据可能会太大&#xff0c;就需要进行拆分…

大恒相机-程序异常退出后显示被占用

心跳时间代表多久向相机发送一次心跳包&#xff0c;如果超时则设备会认为断开了&#xff0c;停止工作并主动释放占用资源。 在相机打开后添加代码&#xff1a; #ifdef _DEBUG//设置心跳超时时间 3sObjFeatureControlPtr->GetIntFeature("GevHeartbeatTimeout")-&…

Maven私服与高级配置:提升企业级开发效率

传递依赖&#xff1a; 添加spring-webmvc的核心依赖坐标时&#xff0c;会发现以外的其他jar包。因为项目依赖spring-webmvc.jar&#xff0c;而spring-webmvc.jar会依赖spring-bean.jar等&#xff0c;所以依赖spring-webmvc.jar时它依赖的jar包也会出现在当前工程中&#xff0c…

Github上传大文件(>25MB)教程

0.在github中创建新的项目&#xff08;已创建可忽略这一步&#xff09; 如上图所示&#xff0c;点击New repository 进入如下页面&#xff1a; 1.下载Git LFS 下载git 2.打开gitbash 3.上传文件&#xff0c;代码如下: cd upload #进入名为upload的文件夹&#xff0c;提前…

docker安装部署mysql后忘记root密码

应用场景是&#xff1a;用docker安装完mysql后&#xff0c;使用安装时候设置的密码登录不上MySQL&#xff1b; 1、修改docker映射出mysql的配置文件&#xff1a;my.cnf 在mysqld最下方添加skip-grant-tables进入安全模式&#xff08;随意一个密码即可登录mysql&#xff09; [m…

Key exchange failed.No compatible key exchange method.

使用远程工具secureCRT (版本&#xff1a;Version 7.0.0 (x64 build 326) ) 连接Linux&#xff08;Ubuntu-22.04&#xff09;系统 若20之前的ubuntu系统版本参考&#xff1a;&#xff1a; &#x1f517;使用远程工具连接Linux系统 1、检查ssh-server版本 sudo dpk…

【御控物联】 JavaScript JSON结构转换(21):数组To对象——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…