C++学习之旅-string类

C++学习之旅-string类

在C语言的学习中对于一些字符串的操作我们可能经常使用的是数组或者指针来存储字符串并执行相应的操作。但是总是会发现操作起来会有一些繁琐(相对与C++来说)在学习了C++之后我发现string类使用起来比数组方便了很多很多。


   ISO/ANSI C++标准通过添加string类扩展了C++库,因此现在可以用string类型的变量(准确的应该称它为对象)而不是字符数组来存储字符串。
   大家会看到,string类使用起来比数组简单,同时提供了将字符串作为一种数据类型的表示方法。
要使用string类,必须在程序中包含头文件<string>.
string类位于空间名称std中,因此我们必须提供一样条using的编译指令、
或者使用std::string来引用它。string类定义隐藏了字符串的数组性质,
让我们可以像处理普通变量一样去处理字符串。

下面是一个较为综合的例子(C PK C++)
这里写图片描述
这里写图片描述

在Linux下的运行结果
这里写图片描述

结果如我们所愿,结果都是相同的,我们需要去分析一下这两者的不同。
在很多方面,使用string对象的方式与使用字符数组相同

  • 可以使用C-风格的字符串来初始化string对象
  • 可以使用cin来将键盘输入存储到string对象中
  • 可以使用cout来显示string对象
  • 可以使用数组的下标表示法访问存储在string对象中的字符

string类和数组的主要区别是

1、可以将string对象声明为简单变量,而不是数组。类设计让程序能够自动处理string的大小。例如string str;str的声明创建了一个长度为0的string对象,但是程序将输入读取到str中时,将自动的调整str的长度。而数组则需要我们在使用之前就确定其长度。并且必须注意不能越界,如果越界将导致程序终止或者继续运行,但是数据已经损坏。

char name[20];  //此处的20是固定的
string str;     //此处的str可以自动调整长度

2、使用string类时,某些操作比使用数组时来的更简单。例如,不能将数组赋给另一个数组,但是却可以将一个string对象赋给另一个string对象

string str1 = "hello world";
string str2 = str1;    //这样写没有任何问题

char ptr1[20] = "hello world";
char ptr2[20] = ptr1;  //这样就不对了,必须使用strcpy或循环

3、string类简化了字符串合并操作。可以使用操作符+将两个string对象合并起来,而数组则要使用strcat或者循环才可以做到。

//如下
string str1;
string str2;
string str3;
str3 = str1 + str2;
str1 += str2;   //+=将str2连接到str1的末尾

4、下面是两种确定字符串中字符数的方法

char name[20] = "hello";
string str = "hello";
int len1 = str.size();
int len2 = strlen(name);

函数strlen()是一个常规的函数,它接受一个C风格的字符串作为参数,并返回一该字符串包含的字符数。函数size()的功能基本上于此相同,但是句法不同:str是一个对象,而size()是一个类方法。方法是一个函数,只能通过其所属的类的对象进行调用。在这里,str是一个string对象,而size()是string类的一个方法。总之,C函数使用参数来指出要使用哪个字符串,而C++string类对象使用对象名和句点操作符来指出要使用哪个字符串。

5、请看下面这个小栗子

#include <iostream>
#include <cstring>
#include <string>

int main()
{
    using namespace std;

    char dest[20];
    string str;

    cout << "dest len = " << strlen(dest) << endl;
    cout << "str len = " << str.size() << endl;

    cin.getline(dest, 20);
    getline(cin, str);

    cout << "dest = " << dest << endl;
    cout << "str = " << str << endl;

    return 0;
}
/*程序运行结果如下。本来想要传图片的,结果CSDN网站传图片出错就手敲了*/
dest len = 5;   //在我的机器上Linux 
str len = 0;
输入:asdf
输入:qwer
输出:asdf
输出:qwer

从上面这个例子我们可以明显的看出,为初始化的数组的内容是未定义的;其中,函数strlen()从数组的第一个元素开始计算字节数,直到遇到’\0’。(但是’\0’是不包含在strlen所统计的字符中的)


在这个例子中,它一直读到了第6个元素才发现是空字符。对于未初始化的数据,第一个空字符的出现位置是随机的,因此可能大家运行这段程序得到的都不是相同的答案。 另外,在我们输入之前,string定义的对象str的字符串长度为0,这是因为未被初始化的string对象的长度会自动的被设置为0


cin.getline(dest, 20);这种句点表示法表明,函数getline()是一个istream类的方法,第一个参数是目标数组,第二个参数是数组长度*/


getline(cin.str);这里没有句点表示法,这表明这个getline()不是类方法。它将cin作为参数,指出到哪里去查找输入,另外,也没有指出字符串长度的参数,因为string对象会根据字符串的长度自动调整自己的大小。


那么我们就会问了,为什么前一个getline()是istream的类方法,而后一个getline却不是类方法呢?
其实,在C++引入string类之前,C++就有istream类。因此istream的设计考虑到了像 int double等基本的C++数据类型,但是没有考虑到string类型,所以istream类中,有处理int、double和其他基本类型的类方法,但是没有处理string的类方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxnsirius

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值