cpp字符串相关

news/2024/10/14 4:29:24

字符串相关

文章参考:

[详解-字符串] C++必知必会 字符串-string常用各种操作解析 - 知乎 (zhihu.com)

C++ 字符串(string)常用操作总结 - 知乎 (zhihu.com)

c++读取字符串和字符的6种函数_c++获取字符串的每个字符-CSDN博客

头文件

#include <string>

定义字符串

string str;

初始化字符串

string str = "32131";  // 输出32131
cout << str << endl;

获取字符串长度

1.使用length()函数

string str = "Hello World!";
//输出:12
cout << str.length() << endl;

2.使用字符串的size()函数

string str = "Hello World!";
//输出:12
cout << str.size() << endl;

3.使用C风格的字符串函数strlen()(需要包含cstring头文件)

#include<cstring>
const char* cstr = "Hello world!";
//输出:12
cout << strlen(cstr) << endl;

访问字符串元素

1.通过索引的下标从0到size() - 1

string str = "abcd1234";
//输出:abcd1234
for (int i = 0; i < str.size(); i++) { //这里使用str.length()也是可以的cout << str[i];
}
cout << endl;

2.通过迭代器访问字符串

①直接使用auto替代繁琐的类型声明:(推荐)

string str = "abcd1234";
// 输出:abcd1234
for(auto i : str)
{cout << it;
}
cout << endl;

②声明类型

string str = "abcd1234";
// 输出:abcd1234
for(string::iterator it = str.begin(); it != str.end(); it ++ )
{cout << *it;
}
cout << endl;

③或者用auto代替string,效果也是一样的

string str = "abcd1234";
//输出:abcd1234
for (auto it = str.begin(); it != str.end(); it++) {cout << *it;
}
cout << endl;

向字符串中插入元素

1.向字符串指定位置插入元素

string str = "abcdefg";
// 向字符串索引为3的位置插入 1234
str.insert(3, "1234"); // 以3这个位置为起始点,插入数据
// 输出:abc1234defg
cout << str << endl;//向字符串索引为1的位置插入"A"
str.insert(1, "A");
//输出:aAbc1234defg
cout << str << endl;

2.向字符串开头插入元素

string str = "abcdefg";
//向字符串索引为0的位置插入"1234",就是在字符串的开头添加"1234"
str.insert(0, "1234");
//输出:1234abcdefg
cout << str << endl;

等价于要插入的字符串元素直接在前方与该字符串连接:

string str = "abcdefg";
str = "1234" + str;
//输出:1234abcdefg
cout << str << endl;

3.向字符串结尾插入元素

string str = "abcdefg";
//向字符串索引为str.size()的位置插入"1234",就是在字符串的末尾添加"1234"
str.insert(str.size(), "1234");
//输出:abcdefg1234
cout << str << endl;

等价于要插入的字符串元素直接在后方与该字符串连接:

string str = "abcdefg";
str = str + "1234"; //或者str += "1234";
//输出:abcdefg1234
cout << str << endl;

连接字符串

1.通过+连接字符串

string str = "abcdefg";
str = str + "1234"; //或者str += "1234";
//输出:abcdefg1234
cout << str << endl;

2.通过append()函数连接字符串

string str = "abcdefg";
str.append("1234");
//输出:abcdefg1234
cout << str << endl;

删除字符串中的元素:erase()函数

string str ="0123456789";
// //从索引为2的位置开始(包括2),删除3个字符
str.erase(2, 3);
// 输出:0156789
cout << str << endl;string str = "0000123456789";
//从索引为0的位置开始(包括0),删除3个字符
str.erase(0, 3);
//输出:0123456789
cout << str << endl;

修改字符串中的元素

1.通过索引修改

string ste = "0123456789";
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
//输出:abc3456789
cout << str << endl;

2.通过replace()函数替换/修改

string str = "0123456789";
//替换str中从索引1(包括1)开始的3个字符为"abcde"
str.replace(1, "abcde");
// 输出:0abcde456789
cout << str << endl;

查找字符串中的元素/查找子串

1.find()函数

该函数从字符串的开头开始查找子串。

①如果能找到,返回子串第一个字符所在的索引:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.find("world"); 
//输出:7
cout << pos << endl;int pos1 = str.find("llo");
//输出:2
cout << pos1 << endl;

②如果找不到,返回-1,不会报错:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.find("abc"); 
//输出:-1
cout << pos << endl;

2.rfind()函数

该函数从字符串的末尾开始查找子串。

①如果能找到,返回子串第一个字符所在的索引:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.rfind("world"); 
//输出:7
cout << pos << endl;int pos1 = str.rfind("llo");
//输出:2
cout << pos1 << endl;

②如果找不到,返回-1,不会报错:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.rfind("abc"); 
//输出:-1
cout << pos << endl;

截取子串:substr()函数

string str = "0123456789";
//截取字符串从索引3开始的,长度为5的子串
string sub = str.substr(3, 5); 
//输出:34567
cout << sub << endl;

判断字符串是否为空:empty()函数

string str1 = "abc";
//输出:0,表示str1非空
cout << str1.empty() << endl;string str2 = "";
//输出:1,表示str2为空串
cout << str2.empty() << endl;

字符串的比较

1.通过比较运算符来比较

string str1, str2;
str1 = "Hello";
str2 = "Hello";
//输出:1,表示两个字符串相等
cout << (str1 == str2) << endl;str1 = "Hello";
str2 = "World";
//输出:1,表示表示str1小于str2
cout << (str1 < str2) << endl;str1 = "abcd";
str2 = "ABCD";
//输出:1,表示str1大于str2
cout << (str1 > str2) << endl;

2.通过campare()函数来比较

返回0表示相等,负数表示str1小于str2,正数表示str1大于str2

string str1, str2;
str1 = "Hello";
str2 = "Hello";
//输出:0,表示两个字符串相等
cout << str1.compare(str2) << endl;str1 = "Hello";
str2 = "World";
//输出:-1,表示表示str1小于str2
cout << str1.compare(str2) << endl;str1 = "abcd";
str2 = "ABCD";
//输出:1,表示str1大于str2
cout << str1.compare(str2) << endl;

字符串转数字:stoi() / stof() / stod()函数

1.字符串转整数:stoi()函数

string str = "123";
int num = stoi(str);
// 输出:123
cout << num << endl;

2.字符串转浮点数:stof()函数

float floatNum = stof("3.14");
//输出:3.14
cout << floatNum << endl;

3.字符串转双精度浮点数:stod()函数

double doubleNum = stod("6.022e23");
//输出:6.022e+23
cout << doubleNum << endl;

字符串转换大小写

1.转换为大写:toupper()函数

string str = "Hello, World!";
for(char &ch : str)
{ch = toupper(ch); // 将字符串中的字符转换为大写形式
}
//输出:HELLO, WORLD!
cout << str << endl;

2.转换为小写:tolower()函数

string str = "HELLO, WORLD!";
for (char& ch : str) {ch = tolower(ch); // 将字符串中的字符转换为大写形式
}
//输出:hello, world!
cout << str << endl;

字符串读的各种操作

image-20240502144420002

scanf

scanf用于字符串数组,遇到空格或换行就停止

char str[10];
scanf("%s", str);
cout << str << endl;

getline()

可以接受空格,读取时遇到换行符结束

有两种读取方法,法一是string流,法二是iostream流,是两个不一样的函数

  • 使用string
string str;
geline(cin, str);
cout << str << endl;
  • 使用字符串数组
char str[100];
cin.getline(str, 20, '\n');
//cin.getline()里面三个参数,第一个是要储存的字符串数组,第二个是最大长度 + 1,最后一个位置用来存储'\0',也就是说你填20,但是只能存前19个字符,第三个是结束符,可省略,默认是换行符

注意⚠️
程序的输入都建有一个缓冲区,每次输入的过程,其实是计算机先将输入的数据存在输入缓冲区中,而我们使用的输入函数是直接从缓冲区中读取数据。使用cin的时候,遇到空格和换行符和tab键就会停止,此时缓冲区就会有残留数据:空格、换行符、tab。cin和cin.get()从缓冲区读入的时候会自动忽略第一个空格、换行符、tab,就可以正常读入字符串,但有些函数并不能,比如 getline,gets,get, 他们就会直接读取缓冲区剩余的空格、换行符、tab,就导致需要输入的输不进去。
所以如果你使用getline()或gets()或者cin.get()之前用了cin或cin.get(),请务必在cin后面加个getchar();

//法一
string s, ss;
cin>>s;
getchar();
getline(cin, ss);
cout<<ss<<endl;//法二
string s;
char ss[20];
cin>>s;
getchar();
cin.getline(ss, 20);
cout<<ss;

get()

读取字符串时用法同getline()的第二种用法

与getline()的区别是cin.get()会将结束符或换行符残留在输入缓冲区中,而getline不会,所以使用get后如果还要用除cin外的输入函数,就得加一个getchar()

char s[100];
cin.get(s, 10);

读取字符时

char c;
c = cin.get();

还可以和getchar一样读走缓冲区中不要的字符

cin.get();

gets()

字符串数组

char s[10];
gets(s);

gets和getline一样,不会将结束符或换行符留在缓冲区,不过如果缓冲区有结束符或换行符,他也会读进去,所以在前面要加个getchar()

char s[10];
gets(s);
cout<<s<<endl;

也可以用于二维字符数组

char s[3][10];for(int i = 0; i < 3; ++i){gets(s[i]);}for(int i = 0; i < 3; ++i){cout<<s[i]<<endl;}

getchar()

getchar()会从缓冲区读走一个字符,如果输入多个字符,也只会读取第一个

char x = getchar();

个人小结:

  • 按整行读到string ,推荐用 方法2 getline(cin, string)
  • 按整行读到char[] ,推荐用 方法4 cin.getline(cin, char*)
  • 读单个字符串,推荐用 cin>>

啰嗦解释如下:

按行读
方法2 getline(cin, string) 和 方法4 cin.getline(cin, char) 会读到回车为止,并且会把回车丢弃。
方法3 cin.get(cin, char) 不丢弃回车

其他: fgets 会多读入一个回车,比较麻烦

读字符串
cin >> char 会自动忽略起始的空格/回车/tab,结尾如果有回车空格,不会丢弃。 ” aa” => “aa”
scanf(“%s”, char) 同上
cin >> string 同上

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

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

相关文章

响应式动漫音乐/个人博客杂志主题国漫FM模板

国漫FM主题V1.8是以Ajax加以CSS动画的方式,很好的将优雅的设计感和极度精简的代码同时表现了出来,进而缔造出这样一款十分经典的名为Always for you的WordPress博客主题。正如作者自己所言:如果你想让你的WordPress博客看起来个性十足。FM主题为响应式格子布局(瀑布流),是一…

WordPress CVE-2022-4230复现分析

前言 开始CVE审计之旅 WP Statistics WordPress 插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下,具有管理选项功能 (admin+) 的用户可以使用受影响的功能,但是该插件有一个设置允许低权限用户也可以访问它,其实就是没对admi…

光影看图 v4.5.6.32 绿色版

更新流水:2024.04.30:跟进官方 4.5.6.32 , 第一版 修改内容:by.星罗月兔&DxFans去校验(方案来自@星罗月兔);去更新;去多余组件及无用菜单!下载地址:https://down.neoimaging.cn/neoimaging/NeoViewerSetup_10000_4.5.6.32.exe本文来自博客园,作者:萌面蛋饺,转载请注明…

js逆向实战之某证信Accept-Enckey参数加密解析

url:https://webapi.cninfo.com.cn/#/marketDataDate 分析过程抓包,主要关注图中标记的数据包,它的回显数据是我们所需要的。但在该数据包的请求中有一个Accept-Enckey参数是经过加密的,需要知道其加密的逻辑。全局搜索sysapi/p_sysapi1007,只有一处符合的。找到对应地方,…

vite vue-cli 读取文件原始内容 使用base64内容的文件

新建文件 img.dataurl 中存放图片base64 <img class=img :src=dataurl alt= /> import dataurl from ./img.dataurl data(){ return { dataurl:dataurl } } vue.config.js module.exports=defineConfig({ configureWebpack:{module:{rules:[{test:/\.dataurl$/,loader…

Seata AT模式学习

官方文档 Seata是目前国内最流行的一个分布式事务的组件,支持以下4种模式 AT模式:对业务代码无侵入,只要在业务的数据库加上一个UNDO_LOG表,在配置文件中配置好Seata的服务端,在需要开启全局事务的地方加上注解就行 TCC模式:即Try-Commit-Cancel,自定义prepare逻辑、com…

最好用的AI换脸软件,rope下载介绍(支持cpu)

随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深度神经网络的无数次迭代优化,最终得出的模型可以自动学习和识别视频中的人脸特…

提高学生学习成绩和自我效能感:护理培训的移动聊天机器人方法

(Promoting students learning achievement and self-efficacy: A mobile chatbot approach for nursing training) DOI: 10.1111/bjet.13158 一、摘要 研究目的:护理培训的目的不仅在于掌握技能,更在于培养解决问题的决策能力。然而,产科疫苗接种知识等培训项目大多采用以讲…