C++ 字符串 - std::string 在 C++ 中的例子

214 阅读4分钟

字符串是任何编程语言中的重要组成部分,C++也不例外。

无论你是想存储文本、操作文本,还是接受键盘输入和输出,了解什么是字符串以及如何有效地使用它们都是极其重要的。

本文将告诉你在C++中处理和使用字符串所需要知道的一切。

什么是字符串?

字符串,就其核心而言,本质上是字符的集合。一些例子包括 "Hello World"、"My name is Jason",等等。它们被括在双引号中"

在C++中,我们有两种类型的字符串。

  1. C风格的字符串
  2. std::strings (来自C++标准字符串类)

你可以非常容易地创建你自己的字符串类,有它们自己的小函数,但这不是我们在这篇文章中要讨论的问题。

C风格的字符串

这些是源自C语言的字符串,在C++中继续被支持。这些 "字符集合 "是以char 类型的数组形式存储的,这些数组是空尾的(\0 null字符)。

如何定义一个C语言风格的字符串。

char str[] = "c string";

这里,str 是一个长度为9char 数组(额外的字符来自于编译器添加的\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风格的字符串来代替。

  1. 如果你有C语言背景,你可能对使用C风格的字符串感到很舒服。
  2. 一个std::string ,尽管它有好处,但却非常复杂。像语言的其他部分一样,如果你不知道你在做什么,它可以很快变得非常复杂。另外,它使用了大量的内存,对于你的程序来说可能不是很理想。
  3. 如果你在运行时注意管理程序的内存(当你用完一个对象时释放它的内存),考虑到C风格的字符串有多小和轻量级,使用C风格的字符串是有性能优势的。

总结

我希望这篇文章是对C++中字符串的介绍。关于这个奇妙的抽象概念,还有很多 东西需要学习,我希望能写更多的文章,深入研究字符串和C++的高级概念。

请务必在Twitter上关注我的C++学习之旅的更新。学习愉快!


Jason Dsouza

Jason Dsouza

AI研究员@哈佛,老师@freeCodeCamp。兼职编译器术士。


如果你读到这里,请发推特给作者,向他们表示你的关心。鸣谢

免费学习代码。freeCodeCamp的开源课程已经帮助超过40,000人获得了作为开发者的工作。开始吧