Cplusplus 简明教程

C++ Strings

C++ 提供以下两种类型字符串表示形式:

  1. The C-style character string.

  2. 使用标准 C++ 引入的字符串类类型。

The C-Style Character String

C 语言风格字符字符串起源于 C 语言,并且在 C++ 中继续得到支持。此字符串实际上是一个字符一维数组,一个 null 字符 '\0' 终止该数组。因此,一个以 null 结尾的字符串包含组成该字符串的字符和 null 字符。

以下声明和初始化创建一个由单词 "Hello" 构成的字符串。为了在数组末尾保留一个空字符,包含字符串的字符数组的大小比单词 "Hello" 中的字符数量多一个。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

如果你遵循数组初始化规则,则可以将上述语句写成如下形式:

char greeting[] = "Hello";

以下是上面用 C/C++ 中定义的字符串的内存表述 −

string representation

实际上,无需在字符串常量的结尾处放置空字符。C++ 编译器将在初始化数组时自动在字符串结尾处放置 '\0'。我们可以尝试打印上面提到的字符串 −

Example

#include <iostream>

using namespace std;

int main () {

   char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

   cout << "Greeting message: ";
   cout << greeting << endl;

   return 0;
}

编译并执行上述代码后,将产生以下结果 −

Greeting message: Hello

C Style String Functions

C++ 支持大量操作空终止字符串的函数。这些函数在 <string.h> header file 中定义。

Sr.No

Function & Purpose

1

strcpy(s1, s2); 将字符串 s2 复制到字符串 s1 中。

2

strcat(s1, s2); 将字符串 s2 连接到字符串 s1 的结尾。

3

strlen(s1); 返回字符串 s1 的长度。

4

strcmp(s1, s2); 如果 s1 和 s2 相同则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。

5

strchr(s1, ch); 返回字符串 s1 中字符 ch 首次出现的位置的指针。

6

strstr(s1, s2); 返回字符串 s1 中字符串 s2 首次出现的位置的指针。

Example

下面的示例使用了上面提到的几个函数 −

#include <iostream>
#include <cstring>

using namespace std;

int main () {

   char str1[10] = "Hello";
   char str2[10] = "World";
   char str3[10];
   int  len ;

   // copy str1 into str3
   strcpy( str3, str1);
   cout << "strcpy( str3, str1) : " << str3 << endl;

   // concatenates str1 and str2
   strcat( str1, str2);
   cout << "strcat( str1, str2): " << str1 << endl;

   // total lenghth of str1 after concatenation
   len = strlen(str1);
   cout << "strlen(str1) : " << len << endl;

   return 0;
}

当上述代码被编译并执行时,它会产生类似以下结果 −

strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10

The String Class in C++

标准 C++ 函数库提供了一个 string 类类型,支持上面提到的所有操作,另外还提供了更多功能。

Example of String Class

让我们查看以下示例 −

#include <iostream>
#include <string>

using namespace std;

int main () {

   string str1 = "Hello";
   string str2 = "World";
   string str3;
   int  len ;

   // copy str1 into str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;

   // concatenates str1 and str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;

   // total length of str3 after concatenation
   len = str3.size();
   cout << "str3.size() :  " << len << endl;

   return 0;
}

当上述代码被编译并执行时,它会产生类似以下结果 −

str3 : Hello
str1 + str2 : HelloWorld
str3.size() :  10

Creating a String

我们可以使用以下方法之一创建字符串变量,以下两种方法任选 −

Creating String Using Character Arrays

我们可以使用 C-type arrays 以字符的格式声明字符串。此做法使用以下语法 −

char variable_name[len_value] ;

此处,len_value 是字符数组的长度。

在以下示例中,我们声明了一个字符数组,并为其赋值。

#include <iostream>
using namespace std;

int main() {
   char s[5]={'h','e','l','l','o'};
   cout<<s<<endl;
   return 0;
}
hello

Creating String using <string>

我们可以使用 'string' 关键字声明字符串变量。这包含在 <string> header file 中。声明字符串的语法如下文所述 −

string variable_name = [value];

这里,[value] 是可选的,可在声明期间用于赋值。

在以下示例中,我们声明了一个字符串变量,并为其赋值。

#include <iostream>
using namespace std;

int main() {
   string s="a merry tale";
   cout<<s;
   return 0;
}
a merry tale

Traversing a String (Iterate Over a String)

我们可以通过两种方式迭代字符串 −

Using looping statements

我们可以使用for循环、while循环和do while循环遍历字符串,方法是使用指向字符串第一个和最后一个索引的指针。

Using iterators

使用基于范围的循环,我们可以使用迭代器来遍历字符串。这是通过在运行基于范围的循环时使用“:”运算符来实现的。

Example of Iterating a String

以下示例代码显示了使用这两种方法进行字符串遍历的方法:

#include <iostream>
using namespace std;

int main() {
   string s="Hey, I am at TP.";

   for(int i=0;i<s.length();i++){
      cout<<s[i]<<" ";
   }
   cout<<endl;

   for(char c:s){
      cout<<c<<" ";
   }

   return 0;
}
H e y ,   I   a m   a t   T P .
H e y ,   I   a m   a t   T P .

Accessing Characters of String

我们可以使用迭代器和指向字符串索引的指针来访问字符串的字符。

Example

以下示例代码显示了我们如何访问字符串中的字符:

#include <iostream>
using namespace std;

int main() {
   string s="Hey, I am at TP.";
   cout<<s<<endl;
   for(int i=0;i<s.length();i++){
     s[i]='A';
   }
   cout<<s<<endl;

   for(char &c:s){
      c='B';
   }
   cout<<s<<endl;

   return 0;
}
Hey, I am at TP.
AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBB

String Functions

String 是`string`类的对象,因此它具有各种函数,用户可以使用这些函数进行各种操作。其中一些功能如下:

Function

Description

length()

此函数返回字符串的长度。

swap()

此函数用于交换 2 个字符串的值。

size()

用于查找字符串的大小

resize()

此函数用于将字符串的长度调整到给定的字符数。

find()

用于查找作为参数传递的字符串

push_back()

此函数用于将字符推送到字符串的末尾

pop_back()

此函数用于弹出字符串中的最后一个字符

clear()

此函数用于删除字符串的所有元素。

find()

此函数用于在字符串中搜索某个子字符串,并返回子字符串第一个字符的位置。

replace()

此函数用于用新值替换范围内等于旧值的所有元素 [first, last)。

substr()

此函数用于从给定的字符串创建一个子字符串。

compare()

此函数用于比较两个字符串,并以整数的形式返回结果。

erase()

此函数用于删除字符串的某一部分。

Length of a String

字串的长度就是字串中出现字符的数量。因此,“apple”这个字串的长度是 5 个字符,“hello son”这个字串的长度是 9 个字符(包括空格)。这可以使用 <string> header file 中的长度()方法访问。

Syntax

语法解释如下 -

int len = string_1.length();

Example

#include <iostream>
#include <string>
using namespace std;

int main() {
   string x="hey boy";
   cout<<x.length()<<endl;

   return 0;
}
7

String Concatenation

字符串连接是将两个字符串加在一起的一种方法。这可以使用两种方式完成 -

Addition Operator

加法运算符用于添加两个元素。对于字符串,加法运算符连接两个字符串。在以下示例中对此进行了明确解释 -

#include <iostream>
#include <string>
using namespace std;

int main() {
   string x = "10";
   string y = "20";
   cout<<x+y<<endl;

   return 0;
}
1020

这与整数加法不同。当我们取两个整数并使用加法运算符将它们相加时,我们会得到这两个数字的和。

在以下示例中对此进行了明确解释 -

#include <iostream>
#include <string>
using namespace std;

int main() {
   int x = 10;
   int y = 20;
   cout<<x+y<<endl;

   return 0;
}
30

Using string append() method

C++ 是一种面向对象编程语言,因此字符串实际上是一个对象,其中包含可对字符串执行某些操作的函数。我们可以使用 string append() method 将一个字符串附加到另一个字符串。

此操作的语法如下 -

string_1.append(string_2);

此方法的使用在以下示例中进行了明确说明 -

#include <iostream>
#include <string>
using namespace std;

int main() {
   string x="hey boy";
   string y=" now";
   x.append(y);
   cout<<x<<endl;

   return 0;
}
hey boy now

String Input in C++

字符串可以作为程序的输入,最常见的方法是使用 cin 方法。

有三种方法可以将字符串作为输入,这些方法如下 -

  1. cin

  2. getline()

  3. stringstream

Using cin Method

这是将字符串作为输入的最简单方法。语法如下 -

cin>>string_name;
#include <iostream>
using namespace std;

int main() {

   string s;
   cout << "Enter custom string : "<<endl;
   //enter the string here
   cin>>s;
   cout<<"The string is : "<<s;
}

Using getline() Method

getline() 方法可用于从输入流中读取字符串。这在 <string> 头文件中定义。上述方法的语法如下 -

getline(cin, string_name);
#include <iostream>
using namespace std;

int main() {

   string s;
   cout << "Enter String as input : " << endl;
   getline(cin, s);
   //enter the string here
   cout << "Printed string is : " << s << endl;
   return 0;
}

Using stringstream

字符串流类用于一次性接收多个字符串作为输入。上述方法的语法如下 -

Stringstream object_name(string_name);
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main() {

   string s = "Hey, I am at TP";
   stringstream object(s);
   string newstr;
   // >> operator will read from the stringstream object
   while (object >> newstr) {
      cout << newstr << " ";
   }
   return 0;
}
Hey, I am at TP