字符串相关
文章参考:
[详解-字符串] 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;
字符串读的各种操作
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的值存储到x
num = 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;
}
标签:string,cin,char,str,字符串,相关,cout
From: https://www.cnblogs.com/hnu-hua/p/18179472