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

news/2024/5/17 14:07:48/文章来源:https://blog.csdn.net/qq_74375828/article/details/137379808

目录

一、字符串处理函数

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.luyixian.cn/news_show_1045704.aspx

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

相关文章

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

水牛社:互联网赚钱秘籍,免费项目,你真敢要吗?

免费是最贵的。真正理解并使用这句话的只有少数人&#xff0c;今天在网上分享一下免费项目背后的逻辑&#xff0c;抛开现象&#xff0c; 本质是最重要的。 我从事互联网工作15年。不管是过去还是现在&#xff0c;总有人喜欢问有没有免费项目&#xff1f; 其实我平时懒得回答…

如何使用 ChatGPT

原文&#xff1a;How To Use Chatgpt 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 总体介绍 在人工智能和在线创业不断扩张的世界中&#xff0c;ChatGPT 的出现为寻求利用 AI 推动在线成功的个人和企业开辟了令人兴奋的新途径。本书《如何使用 ChatGPT&#xff1a;…

【Linux】进程初步理解

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 冯诺依曼体系结构1.1 认识冯诺依曼体系结构1.2 存储金字塔 2. 操作系统2.1 概念2.2 结构2.3 操作系统的管理 3. 进程3.1 进程描述3.2 Linux下的PCB 4. task_struct本身内部属性4.1 启动4.2 进程的创建方式4.2.1 父…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

106. 跑步锻炼(结果填空)

public class Main { public static void main(String[] args) { int startYear 2000; int startMonth 1; int startDay 1; // 周六 int endYear 2020; int endMonth 10; int endDay 1; // 周四 int totalDistance 0; // 计算开始日期到结束日期之间的每一天 …

应急响应-挖矿脚本检测指南威胁情报样本定性文件清除入口修复

一、演示案例-挖矿样本-Win&Linux-危害&定性 危害&#xff1a;CPU拉满&#xff0c;网络阻塞&#xff0c;服务器卡顿等 定性&#xff1a;威胁情报平台上传解析分析&#xff0c;文件配置查看等windows样本 linux样本 二、演示案例-Linux-Web安全漏洞导致挖矿事件 某公司…

一例简单的文件夹病毒的分析

概述 这是一个典型的文件夹病毒&#xff0c;使用xp时代的文件夹图标&#xff0c;通过可移动存储介质传播&#xff0c;会向http://fionades.com/ABIUS/setup.exe下载恶意载荷执行。 其病毒母体只是一个加载器&#xff0c;会在内存是解密加载一个反射型的dll&#xff0c;主要的…

【C++】缺省参数和函数重载

目录 1.缺省参数 1.1缺省参数的定义 1.2 缺省参数的简单应用 1.3 缺省参数分类&#xff1a;全缺省参数和半缺省参数 1.3.1半缺省参数 1.3.2全缺省参数 3.缺省参数注意事项&#xff1a;缺省参数不能在函数声明和定义中同时出现 4.函数重载 4.1 函数重载概念 4.2 函数参数类型…

2024年32款数据分析工具分五大类总览

数据分析工具在现代商业和科学中扮演着不可或缺的角色&#xff0c;为组织和个人提供了深入洞察和明智决策的能力。这些工具不仅能够处理大规模的数据集&#xff0c;还能通过强大的分析和可视化功能揭示隐藏在数据背后的模式和趋势。数据分析工具软件主要可以划分为以下五个类别…

uniapp Android 开发手机模拟器调试接口出现 Failed to connect to localhost/127.0.0.1:9999

{“errMsg”:“request:fail abort statusCode:-1 Failed to connect to localhost/127.0.0.1:9999”} 原因&#xff1a;使用模拟器或者手机调用API接口&#xff0c;首先保证在同一局域网&#xff0c;然后要使用 IPV4 的 IP 地址。 打开 cmd 输入 ipconfig 查看 ip 地址 替换代…

【java】spring打包找不到主类

背景 使用IDEA打包spring 一直报错&#xff0c;&#xff1a;IDEA spring Error: Could not find or load main class 解决 添加maven的打包命令&#xff1a; 添加&#xff0c;打包依赖到 jar包中 package assembly:single

蓝桥杯练习系统(算法训练)ALGO-958 P0704回文数和质数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个数如果从左往右读和从右往左读数字是完全相同的&#xff0c;则称这个数为回文数&#xff0c;比如898,1221,15651都是回文数。编写…

创新指南|贝恩的产品经理RAPID框架:解决问题的分步指南,使决策过程既高效又民主

您是否曾发现自己陷入项目的阵痛之中&#xff0c;决策混乱、角色不明确、团队成员之间的冲突不断升级&#xff1f;作为产品经理&#xff0c;驾驭这艘船穿过如此汹涌的水域可能是令人畏惧的。应对这些挑战的关键在于采用清晰、结构化的决策方法。输入贝恩的 RAPID 框架&#xff…

Linux文件搜索工具(gnome-search-tool)

opensuse下安装: sudo zypper install gnome-search-tool 操作界面:

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 本文介绍SpringBoot整合Redis并且进行接口的限流&#xff0c;文章主要介绍的是一种思想&#xff0c;具体代码还要结合实际。 一、Windows安装Redis Redis的解压包我放在了百度网盘上&#xff0c;有需要的可以下载。 R…

【第七篇】使用BurpSuite进行主动、被动扫描和主动、被动爬虫

文章目录 前言主动扫描被动扫描主动爬虫被动爬虫前言 Burp Scanner 既可以用作全自动扫描仪,也可以用作增强手动测试工作流程的强大手段。 扫描网站涉及两个阶段: 抓取内容和功能: Burp Scanner 首先在目标站点周围导航,密切反映真实用户的行为。它对站点的结构和内容以及…

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…

Spring boot 入门 ---(一),2024年最新java进阶训练营

spring-snapshots http://repo.spring.io/snapshot spring-milestones http://repo.spring.io/milestone spring-boot-starter-parent是使用Spring Boot的一种不错的方式&#xff0c;但它 并不总是最合适的。有时你可能需要继承一个不同的父POM&#xff0c;或只是不喜欢我…

JVM面试整理--对象的创建和堆

文章目录 对象的创建过程是怎样的?对象在内存中的结构是怎样的&#xff08;专业的叫法&#xff1a;对象的内存布局&#xff09;对象在内存分配时使用的哪种方式&#xff08;有的地方也称为&#xff1a;分配算法&#xff09;知道什么是“指针碰撞”吗&#xff1f;知道什么是“空…