C++基础教程面向对象(学习笔记(94))

std :: string和std :: wstring

标准库包含许多有用的类,但最有用的可能是std :: string。std :: string(和std :: wstring)是一个字符串类,它提供许多操作来分配,比较和修改字符串。在本章中,我们将深入研究这些字符串类。

注意:C风格的字符串将被称为“C风格的字符串”,而std :: strings(和std :: wstring)将简称为“字符串”。

字符串类

在上一课中,我们介绍了 C风格的字符串,它使用char数组来存储字符串。如果你试图用C风格的字符串做任何事情,你很快就会得出这样的结论:它们很难处理,容易搞乱,而且难以调试。

C风格的字符串有许多缺点,主要围绕着你必须自己完成所有内存管理的事实。例如,如果要将字符串“hello!”分配给缓冲区,则必须首先动态分配正确长度的缓冲区:

char *strHello = new char[7];

不要忘记为null终止符占一个额外的字符!

然后你必须实际复制值:

strcpy(strHello, "hello!");

希望你的缓冲区足够大,那样才会没有缓冲区溢出!

当然,因为字符串是动态分配的,所以当你完成它时你必须记住正确地释放它:

delete[] strHello;

不要忘记使用数组删除而不是正常删除!

此外,C提供用于处理数字的许多直观运算符(例如赋值和比较)根本不适用于C风格的字符串。有时这些似乎可以工作,但实际上会产生不正确的结果, 例如,使用==比较两个C风格的字符串实际上会进行指针比较,而不是字符串比较。使用operator =将一个C风格的字符串分配给另一个字符串似乎首先工作,但实际上是在做一个指针副本(浅拷贝),这通常不是你想要的。这些事情可能导致程序崩溃,很难找到和调试!

最重要的是,使用C风格的字符串需要记住许多关于什么是安全/不安全的挑剔规则,记住一堆具有有趣名称的函数,如strcat()和strcmp(),而不是使用直观的运算符,并有很多手动内存管理。

幸运的是,C ++和标准库提供了一种更好的处理字符串的方法:std :: string和std :: wstring类。通过使用构造函数,析构函数和运算符重载等C ++概念,std :: string允许您以直观和安全的方式创建和操作字符串!没有更多的内存管理,没有更奇怪的函数名称,并且灾难的可能性大大降低。

字符串概述

标准库中的所有字符串功能都位于头文件中。要使用它,只需包含字符串标题:

#include <string>

字符串头中实际上有3个不同的字符串类。第一个是名为basic_string <>的模板化基类:

namespace std
{
    template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
        class basic_string;
}

您不会直接使用此类,因此不要担心目前的特征或分配器是什么。在几乎所有可以想象的情况下,默认值都足够了。

标准库提供了两种basic_string <>:

namespace std
{
    typedef basic_string<char> string;
    typedef basic_string<wchar_t> wstring;
}

这些是您实际使用的两个类。std :: string用于标准的ascii(utf-8)字符串。std :: wstring用于宽字符/ unicode(utf-16)字符串。utf-32字符串没有内置类(尽管如果需要,你应该可以从basic_string <>扩展自己的类)。

虽然您将直接使用std :: string和std :: wstring,但所有字符串函数都在basic_string <>类中实现。String和wstring能够通过模板化直接访问该函数。因此,所有呈现的函数都适用于字符串和wstring。但是,因为basic_string是一个模板化的类,所以当你用字符串或wstring执行语法错误时,编译器也会产生可怕的模板错误。不要被这些错误所吓倒; 他们看起来比他们实际的简单得多!

这是字符串类中所有函数的列表。这些功能中的大多数具有多种风格来处理不同类型的输入,我们将在下一课中更深入地介绍这些函数。
在这里插入图片描述
虽然标准库字符串类提供了许多功能,但有一些值得注意的:

         正则表达式支持
         用于从数字创建字符串的构造函数
         大写/大写/小写函数
         不区分大小写的比较
         将字符串标记/拆分为数组
         空白修剪
         格式化字符串sprintf样式
         从utf-8转换为utf-16,反之亦然

对于其中的大多数,您必须编写自己的函数,或者将字符串转换为C风格的字符串(使用c_str())并使用提供此功能的C函数。

在接下来的课程中,我们将更深入地研究字符串类的各种函数。虽然我们将使用字符串作为示例,但一切都同样适用于wstring。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值