字符串
- 定义字符串
- 初始化字符串
- 使用 `std::string` 类
- 使用 C风格字符数组
- 使用 `std::string_view`(C++17及以后)
- 字符串的操作
- 1. `assign()`
- 2. `operator=()`
- 3. `push_back()`
- 4. `append()`
- 5. `insert()`
- 6. `erase()`
- 7. `clear()`
- 8. `resize()`
- 9. `replace()`
- 10. `pop_back()`
- 示例代码
- substr()
- front()
- back()
- 遍历字符串
- 字符元素重赋值
- 使用 `std::string` 类
- 使用 `std::string` 的 `at` 方法
- 使用 C风格字符数组
- 注意事项
- string成员函数
- 1. `size()` 和 `length()`
- 2. `empty()`
- 3. `clear()`
- 4. `resize()`
- string查找
- 1. `find()`
- 2. `find_first_of()`
- 3. `find_first_not_of()`
- 4. `find_last_of()`
- 5. `find_last_not_of()`
- 2. `rfind()`
- 字符串的比较
- 字典顺序(Lexicographical Order)
- 字符串比较的方法
- 字符输入getline
- 函数原型
- 使用 `getline` 从 `std::cin` 读取
- 使用自定义分隔符
- 注意事项
- string转c风格字符串
- 函数原型
- 使用 `c_str()`
- 注意事项
- 字符串与数值的转换
- 从字符串转换为数值
- 从数值转换为字符串
- T245280
- 自动修正
- 代码
- T145188
- 统计数字字符个数
- 代码
定义字符串
-
使用
std::string
类:#include <string>int main() {std::string str1 = "Hello, World!"; // 直接使用字符串字面量初始化std::string str2 = std::string("Another string"); // 使用std::string构造函数std::string str3; // 空字符串str3 = "Yet another string"; // 赋值操作return 0; }
-
使用C风格字符数组:
#include <iostream>int main() {char str[] = "Hello, World!"; // 定义并初始化C风格字符串char anotherStr[] = {'A', 'n', 'o', 't', 'h', 'e', 'r', '\0'}; // 手动定义并初始化C风格字符串return 0; }
-
使用
std::string_view
(C++17及以后):#include <string_view>int main() {std::string str = "Hello, World!";std::string_view view(str); // 非拥有的字符串视图std::string_view literal = "Literal"; // 直接从字符串字面量构造return 0; }
初始化字符串
使用 std::string
类
-
直接初始化:
std::string str = "Hello, World!"; // 使用字符串字面量直接初始化
-
使用构造函数:
std::string str("Hello, World!"); // 使用构造函数和字符串字面量 std::string str("Hello", 5); // 使用构造函数、字符串字面量和长度 // 从cstr("Hello, World!")中的位置5开始,提取长度为6的子字符串std::string substr("Hello, World!", 5, 6);
-
使用字符数组:
char charArray[] = "Hello, World!"; std::string str(charArray); // 从C风格字符串初始化
-
使用字符初始化:
std::string str(10, 'a'); // 创建一个包含10个'a'字符的字符串
-
使用迭代器:
int numbers[] = {1, 2, 3, 4, 5}; std::string str(std::begin(numbers), std::end(numbers)); // str 将包含 "12345"
-
使用
std::initializer_list
:std::string str = {'H', 'e', 'l', 'l', 'o'}; // 使用初始化列表
-
使用
std::vector<char>
或其他容器:std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'}; std::string str(vec.begin(), vec.end());
使用 C风格字符数组
-
直接声明和初始化:
char str[] = "Hello, World!"; // 声明并初始化C风格字符串
-
使用字符赋值:
char str[20]; strcpy(str, "Hello, World!"); // 使用strcpy函数复制字符串
-
逐个字符赋值:
char str[20]; int i = 0; const char* hello = "Hello, World!"; while (hello[i] != '\0') {str[i] = hello[i];++i; } str[i] = '\0'; // 确保字符串以空字符结尾
使用 std::string_view
(C++17及以后)
-
直接初始化:
std::string str = "Hello, World!"; std::string_view view(str); // 从std::string初始化std::string_view
-
使用字符串字面量:
std::string_view view = "Hello, World!"; // 直接从字符串字面量初始化
字符串的操作
1. assign()
用一个新的值来替换字符串的内容。
std::string str = "Hello";
str.assign("World"); // str now contains "World"
2. operator=()
使用赋值运算符来替换字符串的内容。
std::string str = "Hello";
str = "World"; // str now contains "World"
3. push_back()
在字符串的末尾添加一个字符。
std::string str = "Hello";
str.push_back('!'); // str now contains "Hello!"
4. append()
在字符串的末尾添加一个字符串或字符。
std::string str = "Hello";
str.append(" World"); // str now contains "Hello World"
5. insert()
在指定位置插入一个字符串或字符。
std::string str = "Hello";
str.insert(5, " World"); // str now contains "Hello World"
6. erase()
删除字符串中的一部分。
std::string str = "Hello World";
str.erase(6, 5); // str now contains "Hello "
7. clear()
清空字符串,使其变为一个空字符串。
std::string str = "Hello";
str.clear(); // str now contains ""
8. resize()
改变字符串的长度,如果需要,可以用指定的字符填充。
std::string str = "Hello";
str.resize(10, '!'); // str now contains "Hello!!!!!"
9. replace()
替换字符串中的部分内容。
std::string str = "Hello World";
str.replace(6, 5, "there"); // str now contains "Hello there"
10. pop_back()
移除字符串的最后一个字符。
std::string str = "Hello";
str.pop_back(); // str now contains "Hell"
示例代码
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";// 使用assign修改字符串str.assign("Goodbye, World!");std::cout << str << std::endl; // 输出: Goodbye, World!// 使用append添加字符串str.append(" Have a nice day!");std::cout << str << std::endl; // 输出: Goodbye, World! Have a nice day!// 使用insert插入字符串str.insert(7, ", Cruel ");std::cout << str << std::endl; // 输出: Goodbye, Cruel World! Have a nice day!// 使用erase删除字符串的一部分str.erase(14, 6);std::cout << str << std::endl; // 输出: Goodbye, Cruel World! a nice day!// 使用clear清空字符串str.clear();std::cout << str << std::endl; // 输出: (空)return 0;
}
在C++的std::string
类中,substr
、front
和back
是三个用于访问和操作字符串内容的成员函数。
substr()
substr()
函数用于获取字符串的一个子串(substring)。你可以指定子串的起始位置和长度。
std::string substr(size_type pos = 0, size_type len = npos) const;
pos
:子串的起始位置(默认为0,即字符串的开始)。len
:子串的长度(默认为std::string::npos
,即直到字符串的末尾)。
示例代码:
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";// 获取从位置7开始的子串,长度为5std::string sub = str.substr(7, 5);std::cout << sub << std::endl; // 输出: World// 获取从位置0开始直到字符串末尾的子串std::string sub2 = str.substr();std::cout << sub2 << std::endl; // 输出: Hello, World!return 0;
}
front()
front()
函数用于获取字符串的第一个字符。这个函数是C++11标准中引入的,用于提供对字符串第一个元素的访问。
char& front();
const char& front() const;
- 返回一个引用,允许修改字符串的第一个字符(非
const
版本)。 - 返回一个常量引用,不允许修改字符串的第一个字符(
const
版本)。
示例代码:
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";// 获取并打印字符串的第一个字符std::cout << "The first character is: " << str.front() << std::endl; // 输出: H// 修改字符串的第一个字符str.front() = 'h';std::cout << "The modified string is: " << str << std::endl; // 输出: hello, World!return 0;
}
back()
back()
函数用于获取字符串的最后一个字符。这个函数也是C++11标准中引入的,用于提供对字符串最后一个元素的访问。
char& back();
const char& back() const;
- 返回一个引用,允许修改字符串的最后一个字符(非
const
版本)。 - 返回一个常量引用,不允许修改字符串的最后一个字符(
const
版本)。
示例代码:
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";// 获取并打印字符串的最后一个字符std::cout << "The last character is: " << str.back() << std::endl; // 输出: !// 修改字符串的最后一个字符str.back() = '?';std::cout << "The modified string is: " << str << std::endl; // 输出: Hello, World?return 0;
}
遍历字符串
遍历字符串意味着逐个访问字符串中的每个字符,直到字符串结束。
-
使用索引:
#include <iostream> #include <string>int main() {std::string str = "Hello, World!";for (size_t i = 0; i < str.length(); ++i) {std::cout << str[i];}std::cout << std::endl;return 0; }
-
使用C++11范围基于for循环:
#include <iostream> #include <string>int main() {std::string str = "Hello, World!";for (char c : str) {std::cout << c;}std::cout << std::endl;return 0; }
-
使用迭代器:
#include <iostream> #include <string>int main() {std::string str = "Hello, World!";for (std::string::iterator it = str.begin(); it != str.end(); ++it) {std::cout << *it;}std::cout << std::endl;return 0; }
-
使用C风格字符数组的指针遍历:
#include <iostream>int main() {char str[] = "Hello, World!";for (char *p = str; *p != '\0'; ++p) {std::cout << *p;}std::cout << std::endl;return 0; }
字符元素重赋值
在C++中,字符串中的元素重赋值指的是修改字符串中的某个特定位置的字符。对于std::string
类,你可以通过索引来访问和修改字符串中的字符。对于C风格的字符数组,你也可以通过索引来修改字符,但需要确保不要越界。
使用 std::string
类
对于std::string
对象,你可以直接通过下标操作符[]
来访问和修改字符串中的元素。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::cout << "Initial string: " << str << std::endl;// 修改字符串中的元素str[0] = 'h'; // 将第一个字符'H'修改为小写的'h'str[7] = 'w'; // 将第七个字符'W'修改为小写的'w'std::cout << "Modified string: " << str << std::endl;return 0;
}
使用 std::string
的 at
方法
std::string
类还提供了at
方法,它允许你访问字符串中的元素,并在越界时抛出一个std::out_of_range
异常。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::cout << "Initial string: " << str << std::endl;// 使用at方法修改字符串中的元素str.at(0) = 'h'; // 将第一个字符'H'修改为小写的'h'str.at(7) = 'w'; // 将第七个字符'W'修改为小写的'w'std::cout << "Modified string: " << str << std::endl;return 0;
}
使用 C风格字符数组
对于C风格的字符数组,你可以通过下标操作符[]
来访问和修改数组中的元素。
#include <iostream>int main() {char str[] = "Hello, World!";std::cout << "Initial string: " << str << std::endl;// 修改字符串中的元素str[0] = 'h'; // 将第一个字符'H'修改为小写的'h'str[7] = 'w'; // 将第七个字符'W'修改为小写的'w'std::cout << "Modified string: " << str << std::endl;return 0;
}
注意事项
- 当使用
std::string
的[]
操作符时,如果索引超出了字符串的当前长度,std::string
会自动扩展字符串,并用空字符填充新分配的空间,直到索引位置。 - 当使用C风格字符数组时,你需要确保不会越界,因为这可能导致未定义行为,包括程序崩溃。
string成员函数
1. size()
和 length()
size()
和 length()
函数都返回字符串中的字符数。这两个函数在 std::string
类中是等价的,都返回字符串的长度。
#include <iostream>
#include <string>int main() {std::string str = "Hello";std::cout << "Size: " << str.size() << std::endl; // 输出: Size: 5std::cout << "Length: " << str.length() << std::endl; // 输出: Length: 5return 0;
}
2. empty()
empty()
函数检查字符串是否为空。如果字符串为空(即没有字符),则返回 true
;否则返回 false
。
#include <iostream>
#include <string>int main() {std::string str;str.empty() ? std::cout << "String is empty." << std::endl : std::cout << "String is not empty." << std::endl;// 输出: String is empty.std::string str2 = "Hello";str2.empty() ? std::cout << "String is empty." << std::endl : std::cout << "String is not empty." << std::endl;// 输出: String is not empty.return 0;
}
3. clear()
clear()
函数用于清空字符串的内容,使其变为一个空字符串。
#include <iostream>
#include <string>int main() {std::string str = "Hello";std::cout << "Before clear: " << str << std::endl; // 输出: Before clear: Hellostr.clear();std::cout << "After clear: " << str << std::endl; // 输出: After clear: (空)return 0;
}
4. resize()
resize()
函数用于改变字符串的长度。如果新长度大于当前长度,resize()
会在字符串末尾添加指定数量的字符。默认情况下,添加的是空字符('\0'
),但你也可以指定其他字符。
#include <iostream>
#include <string>int main() {std::string str = "Hello";std::cout << "Original string: " << str << std::endl; // 输出: Original string: Hello// 将字符串长度增加到10,添加空字符str.resize(10);//resize(10,'A');用A填空增加的字符std::cout << "Resized string (with '\\0'): " << str << std::endl; // 输出: Resized string (with '\0'): Hello\0\0\0\0// 将字符串长度减少到3str.resize(3);std::cout << "Resized string: " << str << std::endl; // 输出: Resized string: Helreturn 0;
}
string查找
在C++中,std::string
类提供了多个成员函数来查找字符串中的子串(中的字符)或单个字符
。
find(字符或字符串,位置)//位置可以省略,表示从首位开始查找,其它的rfind等函数用法类似
1. find()
find()
函数用于查找子串或字符
在字符串中第一次出现的位置。如果找到,它返回子串或字符的索引;如果没有找到,它返回 std::string::npos
。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::size_t pos = str.find("World");if (pos != std::string::npos) {std::cout << "Found 'World' at position: " << pos << std::endl;} else {std::cout << "'World' not found." << std::endl;}char ch = 'l';pos = str.find(ch);if (pos != std::string::npos) {std::cout << "Found '" << ch << "' at position: " << pos << std::endl;} else {std::cout << "'" << ch << "' not found." << std::endl;}return 0;
}
2. find_first_of()
find_first_of()
函数用于查找任何在指定字符串中出现的字符或字符串在字符串中第一次出现的位置。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::string chars = "Wrd";std::size_t pos = str.find_first_of(chars);if (pos != std::string::npos) {std::cout << "Found one of 'Wrd' at position: " << pos << std::endl;} else {std::cout << "None of 'Wrd' found." << std::endl;}return 0;
}
3. find_first_not_of()
find_first_not_of()
函数用于查找不在指定字符串中的字符或字符串第一次出现的位置。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::string chars = "Hlo";std::size_t pos = str.find_first_not_of(chars);if (pos != std::string::npos) {std::cout << "Found a character not in 'Hlo' at position: " << pos << std::endl;} else {std::cout << "All characters are in 'Hlo'." << std::endl;}return 0;
}
4. find_last_of()
find_last_of()
函数用于查找任何在指定字符串中出现的字符在字符串中最后一次出现的位置。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::string chars = "Wrd";std::size_t pos = str.find_last_of(chars);if (pos != std::string::npos) {std::cout << "Found one of 'Wrd' at position: " << pos << std::endl;} else {std::cout << "None of 'Wrd' found." << std::endl;}return 0;
}
5. find_last_not_of()
find_last_not_of()
函数用于查找不在指定字符串中的字符最后一次出现的位置。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::string chars = "Hlo";std::size_t pos = str.find_last_not_of(chars);if (pos != std::string::npos) {std::cout << "Found a character not in 'Hlo' at position: " << pos << std::endl;} else {std::cout << "All characters are in 'Hlo'." << std::endl;}return 0;
}
2. rfind()
rfind()
函数用于从字符串的指定位置开始向后搜索子串或字符,并返回子串或字符最后一次出现的索引。如果未找到,则返回std::string::npos
。
std::size_t rfind(const std::string& str, std::size_t pos = std::string::npos) const;
std::size_t rfind(const char* s, std::size_t pos = std::string::npos) const;
std::size_t rfind(char c, std::size_t pos = std::string::npos) const;
str
:要查找的子串。s
:C风格字符串,要查找的子串。c
:要查找的字符。pos
:开始搜索的位置,默认为std::string::npos
,即字符串末尾。
示例:
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::size_t pos = str.rfind("o");if (pos != std::string::npos) {std::cout << "Found 'o' at position: " << pos << std::endl;} else {std::cout << "'o' not found." << std::endl;}return 0;
}
字符串的比较
在C++中,字符串的大小比较和顺序比较实际上是同一回事,因为字符串的比较是基于字典顺序(lexicographical order)进行的。这意味着字符串是按字符从左到右进行比较的,就像在字典中查找单词一样。
字典顺序(Lexicographical Order)
字典顺序是比较字符串的标准方法,它逐个字符比较两个字符串:
- 字符比较:从两个字符串的开始位置比较对应位置的字符。如果一个字符串的字符大于另一个字符串的字符,则该字符串被认为是“更大”的。如果字符相等,则比较下一个字符,依此类推。
- 长度比较:如果两个字符串的相应位置字符都相等,并且一个字符串是另一个字符串的前缀(即一个字符串是另一个字符串的开始部分),那么更长的字符串被认为是“更大”的。
- 完全相等:如果两个字符串在所有字符上都相等,那么它们被认为是相等的。
字符串比较的方法
在C++中,你可以使用以下方法来比较字符串的大小:
-
使用比较运算符(
==
,!=
,<
,>
,<=
,>=
):std::string str1 = "apple"; std::string str2 = "banana"; if (str1 < str2) {std::cout << "str1 is less than str2" << std::endl; } else {std::cout << "str1 is greater than or equal to str2" << std::endl; }
-
使用
std::string
类的compare
方法:std::string str1 = "apple"; std::string str2 = "banana"; if (str1.compare(str2) < 0) {std::cout << "str1 is less than str2" << std::endl; } else {std::cout << "str1 is greater than or equal to str2" << std::endl; }
-
使用
strncmp
函数(对于C风格字符串):const char* str1 = "apple"; const char* str2 = "banana"; if (strncmp(str1, str2, strlen(str1)) < 0) {std::cout << "str1 is less than str2" << std::endl; } else {std::cout << "str1 is greater than or equal to str2" << std::endl; }
字符输入getline
在C++中,getline
是一个非常有用的函数,用于从输入流中读取一行字符串。这个函数可以读取直到换行符('\n'
)为止的所有字符,并将它们存储在一个字符串中。getline
函数通常与 std::cin
(标准输入流)一起使用,但也可以从文件流或其他输入流中读取。
函数原型
getline
函数的原型如下:
std::istream& getline(std::istream& is, std::string& str);
std::istream& getline(std::istream& is, std::string& str, char delim);
is
:输入流的引用,可以是std::cin
或其他输入流。str
:用于存储读取的字符串。delim
:分隔符,默认为换行符'\n'
。读取将停止在遇到这个字符之前。
使用 getline
从 std::cin
读取
#include <iostream>
#include <string>int main() {std::string line;std::cout << "Enter a line of text: ";std::getline(std::cin, line);std::cout << "You entered: " << line << std::endl;return 0;
}
在这个例子中,程序提示用户输入一行文本,然后使用 getline
读取这行文本,并将其存储在 line
字符串中。
使用自定义分隔符
你也可以指定一个自定义的分隔符来读取字符串:
#include <iostream>
#include <string>int main() {std::string line;std::cout << "Enter a line of text separated by ';': ";std::getline(std::cin, line, ';');std::cout << "You entered: " << line << std::endl;return 0;
}
在这个例子中,getline
将读取直到遇到分号(';'
)为止的所有字符。
注意事项
getline
会将换行符(或指定的分隔符)从输入流中消耗掉,但不包括在结果字符串中。- 如果输入流到达文件末尾(EOF),
getline
将不会读取任何内容,并且返回false
。 - 如果在读取过程中发生错误,
getline
也会返回false
。 - cin不会消耗换行符,与getline连用时,注意bug
#include <iostream>
#include<string>
using namespace std;
int main() {string s1,s2;//输入 空空空asdfd换行123换行 cin>>s1;//cin读asdfd到s1,遇到换行符就完成使命。换行符留在缓存,getline读到换行符就显示输出,结束程序 getline(cin,s2);//123没有读,程序就结束了 cout<<s1.size()<<" "<<s2.size()<<endl;return 0;
}
string转c风格字符串
在C++中,c_str()
是 std::string
类的一个成员函数,它返回一个指向以空字符('\0'
)结尾的字符数组的指针。这个字符数组是C风格的字符串,可以用来与接受C风格字符串参数的函数进行接口。
函数原型
c_str()
函数的原型如下:
const char* c_str() const;
这个函数返回一个指向常量字符数组的指针,因此返回的字符串不应该被修改。
使用 c_str()
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";const char* cstr = str.c_str();// 使用C风格字符串std::cout << "C-style string: " << cstr << std::endl;// 传递给接受C风格字符串的函数std::cout << "C-style string length: " << strlen(cstr) << std::endl;return 0;
}
在这个例子中,c_str()
被用来获取 std::string
对象的C风格字符串表示,并将其存储在 cstr
指针中。然后,这个指针被用来输出字符串,并传递给 strlen
函数来计算字符串的长度。
注意事项
c_str()
返回的指针只在原始std::string
对象的生命周期内有效。如果std::string
对象被修改或销毁,那么返回的指针可能变得无效。c_str()
返回的是一个指向常量数据的指针,因此你不应该尝试修改通过c_str()
获取的字符串。- 如果你需要修改字符串,应该直接使用
std::string
对象,或者使用data()
函数,它返回一个非常量的指针,允许修改字符串。
字符串与数值的转换
在C++中,将字符串和数值之间进行转换是一项常见的任务。以下是一些用于执行这些转换的标准库函数和方法:
从字符串转换为数值
-
std::stoi
:将字符串转换为int
。std::string str = "123"; int num = std::stoi(str);
-
std::stol
:将字符串转换为long
。std::string str = "123"; long num = std::stol(str);
-
std::stoll
:将字符串转换为long long
。std::string str = "123"; long long num = std::stoll(str);
-
std::stoul
:将字符串转换为unsigned long
。std::string str = "123"; unsigned long num = std::stoul(str);
-
std::stoull
:将字符串转换为unsigned long long
。std::string str = "123"; unsigned long long num = std::stoull(str);
-
std::stof
:将字符串转换为float
。std::string str = "123.45"; float num = std::stof(str);
-
std::stod
:将字符串转换为double
。std::string str = "123.45"; double num = std::stod(str);
-
std::stold
:将字符串转换为long double
。std::string str = "123.45"; long double num = std::stold(str);
从数值转换为字符串
-
std::to_string
:将数值转换为字符串。int num = 123; std::string str = std::to_string(num);
-
std::stringstream
:使用流操作将数值转换为字符串。#include <sstream> int num = 123; std::stringstream ss; ss << num; std::string str = ss.str();
T245280
自动修正
- 题目描述
大家都知道一些办公软件有自动将字母转换为大写的功能。输入一个长度不超过 100 且不包括空格的字符串。要求将该字符串中的所有小写字母变成大写字母并输出。
- 样例输入
Luogu4!
- 样例输出
LUOGU4!
代码
#include <iostream>
#include<string>
using namespace std;
int main() {string s;cin>>s;for(char c:s){cout<<(char) toupper(c);}return 0;
}
T145188
统计数字字符个数
- 题目描述
输入一行字符,统计出其中数字字符的个数。
- 输入格式
一行字符串,总长度不超过 255 。
- 输出格式
输出为 1 行,输出字符串里面数字字符的个数。
- 样例输入
Peking University is set up at 1898.
- 样例输出
4
代码
#include <iostream>
#include<string>
using namespace std;
int main() {string s1;int c=0; getline(cin,s1);for(auto i:s1){if(isdigit(i)){c++;}}cout<<c;return 0;
}