尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

15. sting类上

15. sting类上 sting类string 类与头文件选string 类由头文件 string 支持它是模板具体化 basic_stringchar 的一个 typedef注头文件string.h和cstring支持对 C 风格字符串以空字符结束的字符串null-terminated stringNBTS进行操作的 C 库字符串函数但不支持string类。std::string::size_type是string类内部定义的一个无符号整数类型。它用来表示字符串的长度、索引以及容器的大小。string::npos是std::string类中定义的一个静态常量它的类型是 size_type。它的定义值是static const size_type npos -1;也就是0xFFFFFFFFFFFFFFFFC 语言用函数处理字符串string类把字符串封装为对象用类的公有接口统一提供构造、赋值、合并、比较、元素访问、查找等功能。#include string // string 类所在头文件模板具体化 basic_stringchar // #include cstring // 仅提供 C 风格字符串函数不提供 string 类 std::string s; // string 对象声明string 的构造函数string类提供多种构造函数用于以不同来源创建字符串对象。常用的有string(const char* s)用s指向的以空字符结束的字符串初始化string(size_type n, char c)创建含n个元素的对象每个元素初始化为字符cstring(const string str)复制构造函数string()默认构造函数长度为 0string(const char* s, size_type n)用s的前n个字符初始化即使超过 NBTS 结尾也照样复制templateclass Iter string(Iter begin, Iter end)用区间[begin, end)内的字符初始化区间包括begin不包括endstring(const string str, size_type pos 0, size_type n npos)从str的位置pos开始复制到结尾或复制n个字符。对象名不同于数组名不会被视为对象的地址因此不能用five 6这种写法必须用five[6]取地址。用字符数参数时若字符数超过字符串实际长度会把内存中字符串后面的内容当作字符复制进去。std::string one(Lottery Winner!); // ctor#1C 风格字符串初始化 std::string two(20, $); // ctor#220 个 $ 字符 std::string three(one); // ctor#3复制构造函数 std::string four; // ctor#4默认构造空字符串 char alls[] Alls well that ends well; std::string five(alls, 20); // ctor#5前 20 个字符 std::string six(alls 6, alls 10); // ctor#6区间 [alls6, alls10) 即 well std::string seven(five[6], five[10]); // ctor#6取对象元素地址作为区间端点 std::string eight(four, 7, 16); // ctor#7four 中从位置 7 起的 16 个字符C11 新增的 string 构造函数C11 为string增加了两个构造函数移动构造函数move constructorstring(string str)和初始化列表构造函数string(initializer_listchar il)。移动构造函数与复制构造函数类似使新创建的string成为str的副本但它不保证将str视为const在有些情况下编译器可使用它而不是复制构造函数以优化性能。初始化列表构造函数使列表初始化语法可用于string类实现“让列表初始化语法普遍实用”的意图。规则限制移动构造函数在语义上“转移”资源而非复制初始化列表构造对string而言用处不大用 C 风格字符串更容易但其存在使string piano_man {L, i, s, z, t};这类声明合法。// C11 新增构造函数 std::string moved(std::move(other)); // 移动构造函数转移资源 std::string comp_lang {L, i, s, z, t}; // 初始化列表构造string 类的输入方式对 C 风格字符串输入有 3 种方式cin info读一个单词、cin.getline(info, 100)与cin.get(info, 100)读一行丢弃 \n。对 string 对象有 2 种方式cin stuff读一个单词与getline(cin, stuff)读一行丢弃 \n。两个版本的getline()都有一个可选参数用于指定分界字符。string版的getline()会自动调整目标string对象的大小使之刚好能存储输入的字符因此不需要指定读取多少字符的数值参数也不会截断输入。设计上有一个区别——读取 C 风格字符串的函数是istream类的方法所以cin是调用对象而string版是独立函数所以cin是函数参数。std::string stuff; std::cin stuff; // 读一个单词到空白字符为止 getline(std::cin, stuff); // 读一行到分界字符为止默认 \n getline(std::cin, stuff, :); // 指定 : 为分界字符getline 读取的三种终止情况与流状态string 版的 getline() 从输入中读取字符并存储到目标 string 中直到发生下列三种情况之一到达文件尾此时输入流的 eofbit 被设置eof() 和 fail() 都返回 true遇到分界字符默认 \n此时把分界字符从输入流中删除但不存储读取的字符数达到最大允许值string::npos 与可分配内存字节数中较小者此时设置输入流的 failbitfail() 返回 true。输入流对象有一个统计系统跟踪流错误状态检测到文件尾设置 eofbit检测到输入错误设置 failbit出现无法识别的故障如硬盘故障设置 badbit一切顺利设置 goodbit。string 版 operator 行为类似但它是读到空白字符并留在队列中而非读到分界字符并丢弃。空白字符指空格、换行符、制表符更普遍地说是任何以 isspace() 调用返回 true 的字符。由于这些输入函数使用输入流、能识别文件尾因此也可用于从文件中读取输入。std::string item; std::ifstream fin(file.txt); // 打开文件流 while (getline(fin, item, :)) { // 以 : 为分界读到文件尾结束 // 处理每个字符串 } if (fin.eof()) { // 检查是否因文件尾结束 // 正常读完 }自定义分界符对换行符的影响将:·指定为分界字符后换行符将被视为常规字符而非分界符。getline 只把指定的分界字符从输入流中删除其他字符包括换行符都作为普通字符读入。注文件每行末尾的换行符会出现在后续读入的字符串中——第一行末尾的换行符会成为包含下一行内容的字符串的第一个字符若两行内容之间只有换行符则该换行符本身会成为某个字符串的全部内容。// 以 : 为分界时行末 \n 成为常规字符 // 例文件内容 sardines:\nChocolate 中\nChocolate 将作为一个整体被读出 getline(fin, item, :); // 分界符仅 :\n 不再截断输入string 的比较与长度string 类对全部 6 个关系运算符都进行了重载可以比较 string 与 string、string 与 C 风格字符串、C 风格字符串与 string。比较依据机器排列序列如 ASCII进行数字小于大写字符大写字符小于小写字符。size() 与 length() 成员函数都返回字符串中的字符数。length() 成员来自较早版本的 string 类size() 是为提供 STL 兼容性而添加的两者功能相同。重载关系运算符使字符串可以像数值变量一样比较比用 strcmp() 简单。每个关系运算符以三种方式被重载以覆盖三种比较组合。std::string snake1(cobra); std::string snake2(coral); char snake3[20] cobra; if (snake1 snake2) // string 与 string 比较 ; // ... if (snake1 snake3) // string 与 C 风格字符串比较 ; // ... if (snake3 ! snake2) // C 风格字符串与 string 比较 ; // ... bool same (snake1.length() snake2.size()); // 两函数均返回字符数
返回列表