字符串是任何编程语言中的重要组成部分,C++也不例外。
无论你是想存储文本、操作文本,还是接受键盘输入和输出,了解什么是字符串以及如何有效地使用它们都是极其重要的。
本文将告诉你在C++中处理和使用字符串所需要知道的一切。
什么是字符串?
字符串,就其核心而言,本质上是字符的集合。一些例子包括 "Hello World"、"My name is Jason",等等。它们被括在双引号中" 。
在C++中,我们有两种类型的字符串。
- C风格的字符串
std::strings (来自C++标准字符串类)
你可以非常容易地创建你自己的字符串类,有它们自己的小函数,但这不是我们在这篇文章中要讨论的问题。
C风格的字符串
这些是源自C语言的字符串,在C++中继续被支持。这些 "字符集合 "是以char 类型的数组形式存储的,这些数组是空尾的(\0 null字符)。
如何定义一个C语言风格的字符串。
char str[] = "c string";
这里,str 是一个长度为9 的char 数组(额外的字符来自于编译器添加的\0 空字符)。
下面是一些在C++中定义C风格字符串的其他方法。
char str[9] = "c string";
char str[] = {'c', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
char str[9] = {'c', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
如何将C风格的字符串传递给一个函数
#include <iostream>
int main() {
char str[] = "This is a C-style string";
display(str);
}
// C-style strings can be passed to functions as follows:
void display(char str[]) {
std::cout << str << "\n";
}
如何在C++中使用C风格的字符串函数
C标准库有几个方便的函数,你可以用它们来处理字符串。虽然它们没有被广泛推荐使用(见下文),但你仍然可以在C++代码中通过包含<cstring> 头来使用它们。
#include <cstring> // required
1. strcpy(s1,s2) --> Copies string s2 into string s1.
2. strcat(s1,s2) --> Concatenates string s2 onto the end of string s1
3. strlen(s1) --> Returns the length of string s1
4. strcmp(s1,s2) --> Returns 0 if s1==s2; less than 0 if s1<s2; greater than 0 if s1>s2
5. strchr(s1,ch) --> Returns a pointer to the first occurrence of character ch in string s1
6. strstr(s1,s2) --> Returns a pointer to the first string s2 in string s1
std::string
C风格的字符串是相对不安全的--如果字符串/字符数组不是空尾的,就会导致一大堆潜在的错误。
例如,缓冲区溢出和其他大量的缺点是C++开发者社区不推荐使用C风格字符串的一些原因。
由C++标准库提供的std::string 类是一个更安全的选择。下面是你如何使用它。
如何定义一个std::string
#include <iostream>
#include <string> // the C++ Standard String Class
int main() {
std::string str = "C++ String";
std::cout << str << "\n"; // prints `C++ String`"
}
需要注意的是C风格的字符串和std::strings之间最明显的区别是字符串的长度 。如果你需要一个C风格的字符串的长度,你需要每次都像这样使用strlen() 函数来计算它。
#include <iostream>
#include <cstring> // required to use `strlen`
int main() {
char str[] = "hello world";
std::cout << strlen(str) << "\n";
}
如果你不把它存储在一个变量中,并在程序的多个部分需要它,你可以很快观察到这个选项是多么昂贵。
另一方面,一个std::string 字符串已经有一个内置的长度属性。要访问它,你可以使用.length() 属性,如下所示。
#include <iostream>
#include <string> // required to use `std::string`
int main() {
std::string str = "freeCodeCamp";
std::cout << str.length() << "\n";
}
简单、整洁、简明,但却是一个重要的计算量的减少。
但访问长度属性并不是使用std::strings的唯一好处。这里还有一些例子。
#include <iostream>
#include <string>
int main() {
std::string str = "freeCodeCamp";
// Inserting a single character into `str`
str.push_back('s');
std::cout << str << "\n"; // `str` is now `freeCodeCamps`
// Deleting the last character from `str`
str.pop_back();
std::cout << str << "\n"; // `str` is now `freeCodeCamp`
// Resizing a string
str.resize(13);
std::cout << str << "\n";
// Decreasing excess capacity of the string
str.shrink_to_fit()
std::cout << str << "\n";
}
如何将一个std::string 传递给一个函数
#include <iostream>
int main() {
std::string str = "This is a C-style string";
display(str);
}
// Passing `std::string`s are as you would normally pass a regular object
void display(std::string str) {
std::cout << str << "\n";
}
什么时候你会使用一个C风格的字符串而不是std::string ?
到现在为止,你应该相信std::strings比C风格的字符串有许多优势(最明显的是自动内存管理)。但有时你会想用C风格的字符串来代替。
- 如果你有C语言背景,你可能对使用C风格的字符串感到很舒服。
- 一个
std::string,尽管它有好处,但却非常复杂。像语言的其他部分一样,如果你不知道你在做什么,它可以很快变得非常复杂。另外,它使用了大量的内存,对于你的程序来说可能不是很理想。 - 如果你在运行时注意管理程序的内存(当你用完一个对象时释放它的内存),考虑到C风格的字符串有多小和轻量级,使用C风格的字符串是有性能优势的。
总结
我希望这篇文章是对C++中字符串的介绍。关于这个奇妙的抽象概念,还有很多 东西需要学习,我希望能写更多的文章,深入研究字符串和C++的高级概念。
请务必在Twitter上关注我的C++学习之旅的更新。学习愉快!

AI研究员@哈佛,老师@freeCodeCamp。兼职编译器术士。
如果你读到这里,请发推特给作者,向他们表示你的关心。鸣谢
免费学习代码。freeCodeCamp的开源课程已经帮助超过40,000人获得了作为开发者的工作。开始吧