string类
string类
string字符串中的某个字符,其数据格式为char;带入作为函数参数时:
1、不改变原来的值,void fun(char a);
2、修改原值,void fun(char& a);
#include <iostream>
using namespace std;
void jiami(char& a){//位移4个的加密方式if(a=='w'||a=='x'||a=='y'||a=='z'||a=='W'||a=='X'||a=='Y'||a=='Z'){a=a-26+4;}elsea=a+4;
}
int main(){int t;cin >> t;while(t--){string s;cin >> s;for(int i=0;i<s.length();i++){if(s[i]<='z'&&s[i]>='a' || s[i]<='Z'&&s[i]>='A'){jiami(s[i]);}else continue;}cout << s << endl;}}
创建:
string str;//生成空字符串string s(str);//对str进行拷贝string s(str, strbegin,strlen);//将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值string s(cstr, char_len);//以C_string类型cstr的前char_len个字符串作为字符串s的初值string s(num ,c);//生成num个c字符的字符串string s(str, stridx);//将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值!!
拼接:
1、+
//+ 操作符string a("sss");string b("SSS");string c;c = a + b;//自加//a+=b;//a+="aaa";
2、append()
结尾加上
string s1("abc");
s1.append("def");
比较
在C++中,`std::string` 提供了多种字符串比较的方法,这些方法使得字符串比较非常直观和灵活。以下是C++中常见的字符串比较方式:
1. 使用比较运算符
C++ 的 `std::string` 类重载了比较运算符(`==`、`!=`、`<`、`>`、`<=`、`>=`),使得字符串比较非常方便。
比较内容是否相等(`==` 和 `!=`)
`==` 用于判断两个字符串的内容是否完全相同。
`!=` 用于判断两个字符串的内容是否不同。
string str1 = "hello";
string str2 = "hello";
string str3 = "world";
bool isEqual = (str1 == str2); // true
bool isNotEqual = (str1 != str3); // true
按字典顺序比较(`<`、`>`、`<=`、`>=`)
这些运算符会按照字典顺序比较两个字符串,比较的是字符串中字符的ASCII值。
string str1 = "apple";
string str2 = "banana";bool isLess = (str1 < str2); // true
bool isGreater = (str1 > str2); // false
bool isLessOrEqual = (str1 <= str2); // true
bool isGreaterOrEqual = (str1 >= str2); // false
2. 使用 `compare()` 方法、
std::string提供了 `compare()` 方法,用于更复杂的比较操作。`compare()` 方法可以比较两个字符串的子串,并且可以指定比较的起始位置和长度。
用法
`compare(const std::string& str)`:比较整个字符串。
返回值:
- 如果两个字符串相等,返回0。
- 如果调用字符串在字典顺序中排在参数字符串之前,返回负整数。
- 如果调用字符串在字典顺序中排在参数字符串之后,返回正整数。
string str1 = "apple";
string str2 = "banana";int result = str1.compare(str2); // 返回负整数
带参数的比较
`compare(size_t pos1, size_t len1, const std::string& str, size_t pos2, size_t len2)`:比较两个字符串的指定子串。
string str1 = "apple";
string str2 = "applepie";int result = str1.compare(0, 5, str2, 0, 5); // 返回0
总结
- 如果只是简单地比较字符串内容是否相等,可以直接使用 `==` 和 `!=`。
- 如果需要按字典顺序比较,可以使用 `<`、`>`、`<=`、`>=`。
- 如果需要更复杂的比较(如比较子串),可以使用 `compare()` 方法。
字符串访问
-
operator[]
和at()
-
operator[]
:通过索引访问字符,例如char c = s[0];
,如果索引越界,行为未定义。 -
at()
:安全地访问字符,如果索引越界,会抛出std::out_of_range
异常。
-
-
front()
和back()
-
front()
:访问第一个字符。 -
back()
:访问最后一个字符。
-
字符串修改
-
append()
和+=
-
append()
:追加字符串,例如s.append(" world");
-
+=
:追加字符串,例如s += " world";
-
-
insert()
-
在指定位置插入字符串,例如
s.insert(0, "Hello ");
-
-
erase()
-
删除指定范围的字符,例如
s.erase(0, 5);
-
-
replace()
-
替换指定范围的字符,例如
s.replace(0, 5, "Hello");
-
字符串查找
-
find()
-
查找子串,返回子串首次出现的位置,如果未找到,返回
std::string::npos
。 -
例如:
size_t pos = s.find("world");
-
-
rfind()
-
从后向前查找子串,返回子串最后一次出现的位置。
-
-
find_first_of()
和find_last_of()
-
查找任意一个字符首次或最后一次出现的位置。
-
字符串转换
-
c_str()
和data()
-
c_str()
:返回C风格的字符串(以null结尾的字符数组)。 -
data()
:返回字符串的内部数据(C++11后,返回的字符串可能不以null结尾)。
-
-
size()
和length()
-
size()
和length()
:返回字符串的长度。
-
-
empty()
-
检查字符串是否为空。
-
子串操作
strtok()
会修改原字符串,在分隔符位置插入\0
,并返回分割后的子串。每次调用返回下一个子串,直到没有更多子串。
-
substr()
-
提取子串,例如
std::string sub = s.substr(0, 5);
-
-
strtok()
strtok()
是一个C语言标准库函数,用于分割字符串。它基于分隔符将字符串分割成多个子串。函数原型
char* strtok(char* str, const char* delim);
-
str
:要分割的字符串。第一次调用时传入目标字符串,之后传入nullptr
。 -
delim
:分隔符字符串,包含所有用作分隔符的字符。
#include <iostream>
#include <string>int main() {std::string s = "hello world";// 字符串访问std::cout << "First character: " << s[0] << std::endl;std::cout << "Last character: " << s.back() << std::endl;// 字符串修改s.append("!");s.insert(6, "C++ ");s.erase(0, 5);s.replace(0, 3, "CPP");std::cout << "Modified string: " << s << std::endl;// 字符串查找size_t pos = s.find("CPP");if (pos != std::string::npos) {std::cout << "Found 'CPP' at position: " << pos << std::endl;}// 字符串比较std::string s2 = "CPP world!";if (s == s2) {std::cout << "Strings are equal." << std::endl;} else {std::cout << "Strings are not equal." << std::endl;}// 子串操作std::string sub = s.substr(4, 5);std::cout << "Substring: " << sub << std::endl;return 0;
}
string类型的变量,在赋值的时候,如果有空格要输入,不能用cin.getline(,)——因为左值是要char*;
但可以用getline()——c++的函数
template <class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& getline(std::basic_istream<_CharT, _Traits>& __is,std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& __str);