跳到主要内容

字符串

在本课程中,您将学习如何使用存储文本的变量。作为人类,文本是我们与计算机程序交互的主要媒介。学习基本的文本存储和操作对于制作人们能够并且愿意使用的功能性应用程序至关重要。

动机

世界依赖于文本。能够存储文本的变量因此变得非常有用。考虑一个程序,它读取用户的姓名,然后用姓名中的字符数来问候他们。

加载姓名的程序
#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,接着是**空**圆括号

调用 size 方法
name.size()

数字和字符串之间的转换

数字和字符串之间不能自由转换,需要专门的*函数*来完成。这是因为 C++ 中的数字类型和字符串类型是截然**不同**的,通常不兼容。虽然这可能令人不快,但这对于编写无错误的代码来说实际上非常重要。

53
"53"

第一个值是算术数字 53。它表示我们可以对其执行数学运算的值。第二个值是由字符 '5''3' 组成的文本。我们不能对字符串执行数学运算;相反,我们可以执行的字符串操作是连接。

以下是尝试在字符串和数字之间进行转换的错误方法,都会导致编译错误

❌ 将数字变量赋值给字符串
int number = 53;
std::string str = number; // Error

要从数字类型(如 intfloat)转换为字符串,我们需要使用 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::string 转换为 int
std::string number_in_str = "53";
int number = std::stoi(number_in_str);

总结

在本课程中,我们学习了 std::string 类型,它表示一系列字符。

提示

前往子课程以了解更多关于**字符串**的信息

字符串

在本课程中,您将学习如何使用存储文本的变量。作为人类,文本是我们与计算机程序交互的主要媒介。学习基本的文本存储和操作对于制作人们能够并且愿意使用的功能性应用程序至关重要。

动机

世界依赖于文本。能够存储文本的变量因此变得非常有用。考虑一个程序,它读取用户的姓名,然后用姓名中的字符数来问候他们。

加载姓名的程序
#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,接着是**空**圆括号

调用 size 方法
name.size()

数字和字符串之间的转换

数字和字符串之间不能自由转换,需要专门的*函数*来完成。这是因为 C++ 中的数字类型和字符串类型是截然**不同**的,通常不兼容。虽然这可能令人不快,但这对于编写无错误的代码来说实际上非常重要。

53
"53"

第一个值是算术数字 53。它表示我们可以对其执行数学运算的值。第二个值是由字符 '5''3' 组成的文本。我们不能对字符串执行数学运算;相反,我们可以执行的字符串操作是连接。

以下是尝试在字符串和数字之间进行转换的错误方法,都会导致编译错误

❌ 将数字变量赋值给字符串
int number = 53;
std::string str = number; // Error

要从数字类型(如 intfloat)转换为字符串,我们需要使用 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::string 转换为 int
std::string number_in_str = "53";
int number = std::stoi(number_in_str);

总结

在本课程中,我们学习了 std::string 类型,它表示一系列字符。

提示

前往子课程以了解更多关于**字符串**的信息