C++ 字符串

C++ 字符串

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

C 风格字符串

C++ 引入的 string 类类型(string class type)

 

C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。

 

一、C 风格字符串

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

 

下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个。

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

依据数组初始化规则,您可以把上面的语句写成以下语句:

char greeting[] = "Hello";

以下是 C/C++ 中定义的字符串的内存表示示意:

C++ 字符串

 

C/C++ 中的字符串表示

其实,您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾。

输出上面的字符串的代码:

#include <iostream>

using namespace std;

 int main ()

{

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

   cout << greeting << endl;

 

   return 0;

}

运行之,参见下图:

C++ 字符串

 

C风格字符串将字符串放在字符数组中,并以空字符'\0'结束,一般利用指针来操作这些字符串。尽管C++支持C风格字符串,但建议在C++程序中尽量不要使用它们。一些用于操作C风格字符串的标准库函数定义在cstring头文件中,是C语言头文件string.h的C++版本。

1)字符串复制函数:

    char *strcpy(char *s,const char ct)

返回值是指向复制后字符串中首字符的指针。。

例子

#include <iostream>

//#include <string.h>

#include <cstring>

using namespace std;

 

int main ()

{

   char str[] = "just test";

   char des[20];

  

   //cout << strcpy(des, str)<< endl;  //本句和下面两句效果相同,但下面两句更直观说明 strcpy()的含义

   strcpy(des, str);

   cout << des<< endl;

 

   return 0;

}

 

运行值,参见下图:

C++ 字符串

 

2)字符串连接函数:char *strcat(char *s,const char *ct)

将串ct复制到串s的后面,形成一个长串。例如:

#include <iostream>

//#include <string.h>

#include <cstring>

using namespace std;

 

int main ()

{

   char str1[]="李小明";

   char str2[]="是大学生";

  

   //cout << strcat(str1,str2)<< endl;  //本句和下面两句效果相同

   strcat(str1,str2);

   cout <<str1<< endl;

 

   return 0;

}

 

运行值,参见下图:

C++ 字符串

 

3)字符串比较函数:int strcmp(const char *cs,const char ct)。

两字符串比较是按字典排序方法进行。两个字符串从第一个字符比较起,如果相同,则比较第二个字符,依此类推,直到不同。哪个字符串对应的字符的ASCII码值大,串就大。如果两串直到结束符都相同,则一样大。若两个字符串相等,则返回0;串cs大,则返回正整数;串ct大,则返回负整数。

#include <iostream>

//#include <string.h>

#include <cstring>

using namespace std;

 

int main ()

{

   char strA[] = "Hello world";

   char strB[] = "Hello, world";

 

   cout << strcmp(strA, strB)<< endl;

 

   return 0;

}

 

运行值,参见下图:

C++ 字符串

 

4)求字符串长度函数:int strlen(const char *s)

这里求出的串长度不包含串结束符在内。而sizeof运算符包括结束符,还包括没有使用的单元。

#include <iostream>

//#include <string.h>

#include <cstring>

using namespace std;

 

int main ()

{

   char str[] = "Hello world";

 

   cout << strlen(str) << endl;

 

   return 0;

}

 

运行值,参见下图:

C++ 字符串

 

二、C++ 中的 String 类

使用 string 类需要包含头文件<string>

C++ 标准库提供了 string 类类型(string class type),支持上述所有的操作,另外还增加了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:

现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看下这个实例,等理解了面向对象的概念之后再回头来理解这个实例。

#include <iostream>

#include <string>

using namespace std;

 

int main ()

{

   string str1 = "Hello";

   string str2 = "World";

   string str3;

   int  len ;

 

   // 复制 str1 到 str3

   str3 = str1;

   cout << "str3 : " << str3 << endl;

 

   // 连接 str1 和 str2

   str3 = str1 + str2;

   cout << "str1 + str2 : " << str3 << endl;

 

   // 连接后,str3 的总长度

   len = str3.size();

   cout << "str3.size() :  " << len << endl;

 

   return 0;

}

 

运行之,参见下图:

C++ 字符串

 

定义 string 变量(对象)的方法:

string s1;

string s2 = "c plus plus";

string s3 = s2;

string s4 (5, 's');

变量 s1 只是定义但没有初始化,编译器会将默认值赋给 s1,默认值是"",也即空字符串。

变量 s2 在定义的同时被初始化为"c plus plus"。与C风格的字符串不同,string 的结尾没有结束标志'\0'。

变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"。string 变量也可以用C风格的字符串进行赋值。

变量 s4 被初始化为由 5 个's'字符组成的字符串,也就是"sssss"。

 

当我们需要知道字符串长度时,可以调用 string 类提供的 length() 函数。如

string s = "http://c.biancheng.net";

int len = s.length(); //结果为22。string 的末尾没有'\0'字符,所以 length() 返回的是字符串的真实长度,而不是长度 +1。

 

,string 类为我们提供了一个转换函数 c_str(),该函数能够将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*)。例如

string path = "D:\\demo.txt";

path.c_str()

 

string 字符串的输入输出

string 类重载了输入输出运算符,可以像对待普通变量那样对待 string 变量,也就是用>>进行输入,用<<进行输出。

#include <iostream>

#include <string>

using namespace std;

int main(){

    string s;

    cin>>s;  //输入字符串

    cout<<s<<endl;  //输出字符串

    return 0;

}

 

 

下面介绍对字符串的操作。

访问字符串中的字符的例:

#include <iostream>

#include <string>

using namespace std;

int main(){

    string s = "abcDEF1234";

    for(int i=0,len=s.length(); i<len; i++){

        cout<<s[i]<<" ";

    }

    cout<<endl;

    s[4] = '6';

    cout<<s<<endl;

    return 0;

}

 

运行之,参见下图:

C++ 字符串