C++ Primer Puls阅读笔记(16)

89 阅读2分钟

第十六章 string类和标准模板库

16.1 string类

string类是由头文件string支持的(注意,头文件string.h和cstring支持对C-风格字符串进行操纵的C库字符串函数)

1)构造字符串

image.png

char alls[] = "All's well that ends well";
string six(alls + 6, alls + 10); //使用的是表中最后的一个构造函数,数组名相当于指针

string five("All's well that ends well");
string seven(five + 6, five + 10); //error,对象名不会被看作是对象的地址,因此five不是指针
//正确用法
string seven(&five[6], &five[10]); //&five[6]是一个char值,所以&five[6]是一个地址,因此可被用作该构造函数的一个参数

2)string类输入

  • C-风格字符串,有三种方式:
char info[100];
cin >> info; //read a word
cin.getline(info, 100); // read a line, discard \n
cin.ge
t(info,100); //read a line, leave \n in queue
  • string对象,有两种方式:
string stuff;
cin >> stuff; //read a word
getline(cin, stuff); // read a line, discard \n
  • 两个版本getline的区别
//都有一个可选参数,用于指定哪个字符来确定输入的边界
cin.getline(info, 100, ':'); //read up to :, discard :
getline(stuff,':');
/*
在功能上,它们的区别在于,string版本的getline()将自动调整目标string对象的大小,使之刚好能够存储输入的字符
*/
char fname[10];
string lname;
cin >> fname; //限制输入的size<=9
cin >> lname; //无长度限制
cin.getline(fname, 10); //会截断字符串
getline(cin, fname);//无截断

深入探讨一下string输入函数。string的两个输入函数都自动调整目标string的大小,使之与输入匹配。但也存在限制:

  1. string对象的最大允许长度是由常量string::npos指定。通常为最大的unsigned int值,在普通交互式输入中,足够用;但在文件读取中,可能会成为限制条件
  2. 程序可使用的内存量会限制输入的大小
    string版本的getline()函数从输入中读取字符串,并将其存储到目标string中,直到发生下列3种情况:
  • 达文件尾,在这种情况下,输入流的eofbit将被设置,这意味着方法fail()和eof()都将返回true
  • 遇到分界字符(默认为\n),在这种情况下,将把分界字符从输入流中删除,但不存储它
  • 读取的字符数达到最大允许值(string::npos和可供分配的内存字节数中较小的一个),在这种情况下,将设置输入流的failbit,这意味着方法fail()将返回true

输入流系统中有一个用于跟踪流的错误状态:

  • 检测到文件尾后,将设置eofbit寄存器
  • 检测到输入错误时,将设置failbit寄存器
  • 出现无法识别的故障时,将设置badbit寄存器
  • 一切顺利时,将设置goodbit寄存器