4.string

string

1.string简介

  • string是C++标准库的重要组成部分,主要用于字符串处理。
  • 使用string库需要在头文件中包括该库 #include<string>
  • string与char[]不同, string实现了高度的封装,可以很方便地完成各种字符串的操作,比如拼接、截取、匹配等等。
  1. 字符串管理: string封装了字符串的存储和管理。它自动处理字符串的内存分配和释放,避免了手动管理内存的麻烦。
  2. 动态大小调整: string可以根据需要自动调整字符串的大小。在添加或删除字符时,string会自动调整内部的存储容量,确保足够的空间来容纳字符串。
  3. 安全性: string提供了一些方法来确保字符串的安全性。例如,它提供了越界访问检查,以避免访问超出字符串范围的字符。
  4. 迭代器支持: string支持迭代器,可以使用迭代器遍历字符串中的字符,进行字符级别的操作。
  5. 兼容性: string是C++标准库的一部分,因此在C++中广泛使用,并且与其他标准库组件和C++语言特性兼容。

2.string的声明与初始化

#include <bits/stdc++.h>
using namespace std;

int main() {

	// 声明并初始化一个空字符串
	string str1;
	
	// 使用字符串字面量初始化字符串
	string str2 = "Hello, World!";
	
	// 使用另一个string对象未初始化字符串
	string str3 = str2;
	
	// 使用部分字符串初始化字符串 substr(起始位置, 长度)
	string str4 = str2.substr(0, 5);
	
	// 使用字符数组初始化字符串
	const char* charArray = "Hello";
	string str5(charArray);
	
	// 使用重复的字符初始化字符串 string(个数,字符)
	string str6(5, 'A'); 
	
	// 输出字符串的内容
	cout << "str1: " << str1 << endl;//str1:
	cout << "str2: " << str2 << endl;//str2:Hello World!
	cout << "str3: " << str3 << endl;//str3:Hello World!
	cout << "str4: " << str4 << endl;//str4:Hello 
	cout << "str5: " << str5 << endl;//str5:Hello 
	cout << "str6: " << str6 << endl;//str6:AAAAA
	
	return 0;
} 

之前还讲过一种读入一行字符串的方式:getline(cin, s);

3.各种基本操作

3.1 string的输出

在C++中,std::string类提供了一个成员函数c_str(),用于返回一个指向以空字符结尾的C风格字符串(即const char*类型)。在进行printf输出时,需要将string转换为C风格的字符串进行输出

#include <bits/stdc++.h>
using namespace std;

int main() {
	
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	char buf[100];   // 临时变量,用于输入
	scanf("%s", buf);// 输入buf
	string str(buf); // 用buf来构造str
	printf("str = %s\n", str.c_str()); // 输出str 
	
	return 0; 
}

1)获取字符串长度(length/size)

	string str = "Hello, World!";
	int length = str.length(); // 或者int length = str.size();
	cout << "Length: " << length << endl;  // 13

2)拼接字符串(+或append)

	string str1 = "Hello";
	string str2 = "World!";
	string result1 = str1 + ", " + str2; // 使用 + 运算符
	string result2 = str1.append(", ").append(str2);// 使用append()函数
	cout << "Result 1: " << result1 << endl; // Result 1: Hello, World!
	cout << "Result 2: " << result2 << endl; // Result 2: Hello, World!

3)字符串查找(find)

	string str = "Hello, World";
	size_t pos = str.find("World"); // 查找字符串的位置
	if(pos != -1) {
		cout << "Substring found at position: " << pos << endl; // World中的W的下标7 
	} else {
		cout << "Substring not found." << endl;
	}

4)字符串替换

	string str = "Hello, World";
	str.replace(7, 5, "Universe"); // (起始位置, 长度)
	cout << "Reresult: " << str << endl; 

5)提取字符串(substr)

string str = "Hello, World!";
	string subStr = str.substr(7, 5); // 提取子字符串, (位置, 长度) 
	cout << "Substring: " << subStr << endl; // Substring: World

6)字符串比较(compare)

string str1 = "Hello";
	string str2 = "World";
	int result = str1.compare(str2); // 比较字符串
	if(result == 0) {
		cout << "String are equal." << endl;
	} else if(result < 0){
		cout << "String 1 is less than String 2." << endl; // 输出 
	} else {
		cout << "String 1 is greater than String 2." << endl;
	}

string重载了不等号,所以可以直接使用s1<s2的方式来比较string的大小,比较的规则是按照字典序大小进行比较。

字典序的比较方法是从小到大一个一个比较,一旦遇到不相等的字符就确定大小关系。

例如:

  • aaaa < bbbb
  • azz < baaa
  • azzzzzzzzz < b
  • lanqiao == lanqiao

7)大小写转换

转换为大写:

  • toupper() 函数:将单个字符转换为大写。toupper() 函数返回的是一个 int 类型的值,表示转换后的大写字符的 ASCII 值。因此,cout << toupper('a') << endl; 输出的将是 ASCII 值,而不是字符。

    • 	char ch = 'a';
      	char CH = toupper(ch);
      	
      	cout << "转换前的字符:" << ch << endl; // 'a'
          cout << "转换后的字符:" << CH << endl; // 'A'
      	// 如果为cout << toupper('a') << endl; // 65
      
  • std::transform() 函数:将整个字符串转换为大写。

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    string str = "Hello World!";
    // 转换为大写, 前两个参数为范围, 第三个参数是开始改变的迭代器,第四个参数是变化的函数
    transform(str.begin(), str.end(), str.begin(), ::toupper);
    cout << "转换后的字符串为:" << str << endl;
    return 0;
}

转换为小写:

  • tolower() 函数:将单个字符转换为小写。
  • std::transform() 函数:将整个字符串转换为小写

属性:

  • size()length():返回字符串的长度。
  • empty():检查字符串是否为空。
  • capacity():返回字符串的当前容量。
  • max_size():返回字符串的最大可容纳字符数。

函数:

  • c_str():返回以null结尾的C风格字符串。
  • append()+=:将一个字符串追加到另一个字符串的末尾。
  • compare():比较两个字符串。
  • substr():返回一个子字符串。
  • find():在字符串中查找指定子字符串的第一个匹配位置。
  • replace():用新的字符串替换指定位置的子字符串。
  • erase():从字符串中删除指定范围的字符
  • insert():在指定位置插入一个字符串或字符。

3.2 string的遍历

常用的遍历string的方法有两种:

1)循环枚举下标

2)auto枚举(其中&表示取引用类型,如果对i修改将会改变原来的值)

	string s = "Hello";
	for(int i = 0; i < s.length(); i ++) cout << s[i]; // Hello
	cout << "\n";
	for(auto i : s) {
		cout << i;
		i = 'a'; // 此处的修改无效:因为这个i是拷贝出来的,而不是引用s的 
	}
	cout << "\n";//Hello 
	// 此时 s = "Hello"
	for(auto &i : s){
		cout << i;
		i = 'a';
	}//此处修改会改变s的字符值 
	cout << '\n';
	// 此时s = "aaaa"
	cout << s << "\n"; // aaaa

4. 类型转换

从string类型转换为int类型:

string str = "12345";
int num = stoi(str);

从int类型转换为string类型:

int num = 12345;
string str = to_string(num);
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值