字符串相关

news/2024/10/4 17:26:25

字符串相关

文章参考:

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

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

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

字符串使用大全(比较实用的):C++中的String的常用函数用法总结_string函数-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 同上

类型转换

  • int转string
// to_string()
#include <iostream>
#include <string>using namespace std;int main() {int num = 123;std::string str = to_string(num);std::cout << str;return 0;
}
  • string转int
// stoi()
#include <iostream>
#include <string>int main() {std::string str = "123";int num;// 使用stoi()将str1的值存储到xnum = std::stoi(str);std::cout << num;return 0;
}
  • char转int

使用std :: atoi()函数将char数组转换为int。 atoi()函数在cstdlib头文件中定义。

#include <iostream>// atoi()需要 cstdlib
#include <cstdlib>using namespace std;int main() {// 声明和初始化字符数组char str[] = "456";int num = std::atoi(str);std::cout << "num = " << num;return 0;
}

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

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

相关文章

二分

二分 浮点数二分模板bool check(double x) {/* ... */} // 检查x是否满足某种特性double bsearch_3(double l, double r) {const double eps = 1e-6;while(r - l > eps){double mid = (l + r) / 2;if(check(mid)) r = mid;else l = mid;} return l; }整数二分模板bool chec…

【攻防技术系列+Python】-- 用 Python 控制系统进程

用 Python 控制系统进程 由于注册表几乎可以决定整个操作系统的运行,因此它成为安全工具与恶意软件对抗的主要战场之一。除了注册表之外,对系统进程的控制也是安全工具和恶意软件的必争之地。这里我们首先要了解程序和进程的区别。程序是静态的,进程是动态的。进程可以分为系…

VMware如何将虚拟机的端口服务映射出去

我们有时候在VMware起了一个服务,想要局域网的朋友同事访问 这时候就需要i端口映射 选择NAT模式 VMnet8点击 NAT设置 然后点击添加然后映射传入端口对话框 红色部分是 你主机本机,也就是你在用的电脑的空闲端口(可以打开cmd 输入命令 : netstat -ano 查看已用端口都有哪些…

基于改进MFCC特征和卷积递归神经网络的心音分类

具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能 心音分类在心血管疾病的早期发现中起着至关重要的作用,特别是对于小型初级卫生保健诊所。尽管近年来心音分类取得了很大进展,但其中大多数都是基于传统的分段特征和基于浅层结构的分类器。这些传统的声…

基于总线设备驱动模型的按键读取驱动程序

本次实验基于总线设备驱动模型实现按键驱动程序的编写,给上层应用程序提供检测按键是否按下的操作接口,上层应用根据按键是否按下控制led的亮灭。所以上层应用程序会同时使用led和按键的驱动接口,但是对于下层驱动而言,这二者是分离的,因此只需要专注于编写按键驱动程序就…

线~段~树

点击查看代码 #include<bits/stdc++.h> #define lson id<<1 #define rson id<<1|1 using namespace std; const int N=1e6+12000; struct node{int l,r,num;int ma,mi; }tr[N<<2]; int a[N]; int n,m; string str; int ans=0; int from,to; void build…

2024 年 5 月 7 日 周二 晴 常(324 字)

正文早上两头跑应付工作时,客户部的同事说我像被吸干了阳气。没办法啊,觉没睡够不就应该这样吗…… 休息好了肯定不这样。另外,才知道这周六补班,那一瞬间有些想死(笑。文竹的末端叶子好像还是没有变绿呢。有些担心。或许应该有点耐心?鱼儿的手机似乎坏了,于是也买了一个…

一种光电容积波PPG 转换到心电图ECG进行房颤检测的神经网络模型

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 光电体积描记法(PPG)是一种经济有效的非侵入性技术,利用光学方法测量心脏生理学。 PPG 在健康监测领域越来越受欢迎,并用于各种商业和临床可穿戴设备。与心电图(ECG)相比,PPG 并没有提供实质性的…