字符串
在本课程中,您将学习如何使用存储文本的变量。作为人类,文本是我们与计算机程序交互的主要媒介。学习基本的文本存储和操作对于制作人们能够并且愿意使用的功能性应用程序至关重要。
动机
世界依赖于文本。能够存储文本的变量因此变得非常有用。考虑一个程序,它读取用户的姓名,然后用姓名中的字符数来问候他们。
#include <iostream>
#include <string>
int main()
{
std::string name;
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "Welcome, " << name << "!\n";
std::cout << "Your name has " << name.size() << " characters.\n";
}
一种存储文本的类型
在之前的课程中,我们讨论了不同类型的变量,但我们主要关注那些存储数字的变量。我们提到了 char
类型,它存储**单个字符**。
在编程中,文本是一系列字符——被称为**字符串**。C++ 为我们提供了 std::string
类型来存储和操作字符串。
您必须包含 string
头文件才能在代码中使用 std::string
,就像我们之前使用 iostream
一样
#include <string>
std::string
类型的使用就像其他任何类型一样。这里,我们创建了两个变量——一个 int
类型,另一个 std::string
类型
int number;
std::string text;
初始化
初始值的赋值与其它类型的变量相同,但请注意,文本是用**双引号**而不是单引号指定的
std::string welcome = "Hello, World!";
std::cout << welcome;
如果没有给定值,字符串将是*空的*。文本长度为 0,打印到控制台将不显示任何内容。
字符串操作
用户交互
我们可以使用 std::cout
显示字符串,并使用 std::cin
加载它们。
#include <iostream>
#include <string>
int main()
{
std::string name;
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "Welcome, " << name << "!\n";
}
请注意,std::cin
会读取输入的文本,直到它遇到第一个空白字符,例如空格、制表符或换行符。因此,如果我们输入名字和姓氏,只有名字会进入 name
变量。要获取整行文本,您可以使用 std::getline
std::string full_name;
std::getline(std::cin, full_name);
std::getline
是一个*函数*,它接受两个参数 - 一个用于从中读取行的*输入流*,以及一个用于存储行的 std::string
变量。这个例子展示了如何使用这个函数从 std::cin
读取一行。因此,通过放置函数名 std::getline
,然后是括号 (...)
,并在括号内提供我们想要提供的参数 std::cin, full_name
,来“调用”这个函数。
组合字符串
+
和 +=
运算符可用于**连接**和**追加**字符串。考虑以下简略示例,输入为 Dwayne Johnson
std::string first_name;
std::string last_name;
std::cin >> first_name;
std::cin >> last_name;
// Concatenation
std::string coolName = first_name + " \"The Rock\" " + last_name;
std::cout << "Your cool name is:\n" << coolName << "\n\n";
// Appending
coolName += " Mk II";
std::cout << "Your new name is:\n" << coolName;
Your cool name is:
Dwayne "The Rock" Johnson
Your new name is:
Dwayne "The Rock" Johnson Mk II
注意 coolName
是如何通过**连接**三个字符串——first_name
、"The Rock"
和 last_name
的结果。然后,看看我们是如何通过**追加** " Mk II"
来修改 coolName
的。
读取长度
要检查字符串中有多少个字符,我们使用所谓的*方法* size
。我们将在课程的后面更多地讨论函数和方法,因为它们是一个非常重要的概念。
让我们看看如何在实践中使用 size
方法。考虑以下示例,输入为 Johnny
#include <iostream>
#include <string>
int main()
{
std::string name;
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "\nWelcome, " << name << "!\n";
std::cout << "Your name has " << name.size() << " characters.\n";
}
Welcome, Johnny!
Your name has 6 characters.
我们通过 name.size()
调用 size
方法。.
表示我们正在访问 name
变量上的某些内容。size
是我们正在访问的方法的名称。()
*调用*了 size
方法。这会返回给我们字符串中的总字符数。这些术语现在不必强记,但您将在后面的函数和方法课程中看到它们;只需记住如何使用它。
重申一下,我们指定变量 (name
),然后在句点后写入 size
,接着是**空**圆括号
name.size()
数字和字符串之间的转换
数字和字符串之间不能自由转换,需要专门的*函数*来完成。这是因为 C++ 中的数字类型和字符串类型是截然**不同**的,通常不兼容。虽然这可能令人不快,但这对于编写无错误的代码来说实际上非常重要。
53
"53"
第一个值是算术数字 53
。它表示我们可以对其执行数学运算的值。第二个值是由字符 '5'
和 '3'
组成的文本。我们不能对字符串执行数学运算;相反,我们可以执行的字符串操作是连接。
以下是尝试在字符串和数字之间进行转换的错误方法,都会导致编译错误
- ❌ 错误
- ❌ 错误
- ❌ 错误
- ❌ 错误
int number = 53;
std::string str = number; // Error
std::string str = 53; // Error
std::string str = "53";
int number = str; // Error
int number = "53"; // Error
要从数字类型(如 int
或 float
)转换为字符串,我们需要使用 std::to_string
函数。
int number = 53;
std::string number_in_str = std::to_string(number);
同样,如果我们将一个数字存储在字符串中,我们可以用 std::stoi
(*string to int*) 将其转换为 int
类型,并用 std::stof
(*string to float*) 将其转换为 float
类型
- 🔵 std::stoi
- 🟣 std::stof
std::string number_in_str = "53";
int number = std::stoi(number_in_str);
std::string number_in_str = "53.5"; // do not put `f` at the end in the text
float number = std::stof(number_in_str);
总结
在本课程中,我们学习了 std::string
类型,它表示一系列字符。