标准库类型string的基本功能和使用

  • String基本知识
    • 初始化
    • 基本操作
    • 范围for语句
    • string定义的迭代器及其他
    • 关于下标操作
  • 示例代码
    • 练习3.6
    • cctype.cpp
    • punctRemove.cpp
    • char_repl.cpp

本文是本人大一期间在校学习C++课程时所撰写的实验报告的摘录,由于刚上大学,刚接触计算机编程方面的相关知识,故可能会有很多不足甚至错误的地方,还请各位看官指出及纠正。
本文所涉及到的“教材”指:
电子工业出版社《C++ Primary中文版(第5版)》
如需转载或引用请标明出处。

String基本知识

标准库类型string表示可变长的字符序列,其类型与C语言中的字符串字面值的类型是不同的。与C语言管用的用字符数组表示字符串相比,string的一大特点是其可以改变长度,更有灵活性。

初始化

初始化string对象的方法有很多:

  1. string str1
    表示默认初始化,str1是一个空字符串

  2. string str2 = str1
    表示str2是str1的副本

  3. string str3 = “value”
    表示str3是字面值”value”的副本,不包括最后的空字符

  4. string str4(n, ‘c’)
    表示把str4初始化为由连续n个字符c组成的串

    更多初始化string对象的方法详见教材第76页

基本操作

string包括了一些便捷的成员函数,如size、empty等。同时string也支持很多便捷的操作,如使用+直接返回两个string相连后的结果,使用==、<、>=等直接比较两个string的大小等。具体的string操作在教材第77页有详细的表格,这里就不再复述了。这里要注意的是getline函数是从输入中读取一整行,与cin >> str是不一样的,后者只从第一个非空白字符读取到下一个空白字符前,再返回给str。

处理string对象中元素的方法有很多,包括了for循环、范围for循环、while循环、string定义的迭代器、指针等。配合上cctype头文件中的函数,可以很方便地处理string对象中的元素。

下面是cctype头文件中包含的一些函数的简单介绍:

  1. isalnum( c )
    当c是字母或数字时为真

  2. isalpha( c )
    当c是字母时为真

  3. islower( c )
    当c是小写字母时为真

  4. toupper( c )
    若c时小写字母,则输出相应的大写字母;否则原样输出c

    更多cctype头文件包含的函数详见教材第82页。

范围for语句

关于范围for循环语句:
范围for语句的语法形式是:

 for (declaration : expression)statement

其中expression部分是一个对象,用于表示一个序列,declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。使用该语句可以很方便地处理string中的每一个元素。例如:

for (auto &c : str)             //str是一个字符串c = ‘X’;             //每行输出一个str中的一个字符

上述代码的作用是遍历str中的每一个元素,使每一个元素都变为X。关键字auto让编译器决定变量c的类型,这里c的类型是char。其中&符号表示c是引用,目前我学到的是只有通过引用或解引用指针的形式才能改变数组或string中的元素。

string定义的迭代器及其他

string::iterator与string::const_iterator是string定义的迭代器类型,分别为非常量迭代器和常量迭代器,其作用与指针有相似之处,都可以进行递增、递减操作,都可以通过解引用获得string中的元素。非常量迭代器允许改变其所指向的元素,常量迭代器不允许。

string成员函数begin、end与size的用途和原理,与实验一中vector的同名成员函数是类似的,其中size返回的类型是string::size_type。

关于下标操作

string类型支持用下标表示法操作其中的元素,下标返回的是一个引用,故可以通过下标改变string其中的元素。

示例代码

练习3.6

#include <iostream>
//声明使用命名空间std中的名字
using namespace std;#include <string>int main()
{string line;  //声明变量line,用于临时存储字符串getline(cin, line);  //读入字符串//声明引用ch,这样才能改变line中的字符//使用范围for遍历line中的每个字符for (auto &ch : line)  ch = 'X';  //将每个字符改变为'X'cout << line << endl;system("pause");return 0;
}

cctype.cpp

#include <string>
//声明使用string
using std::string;//包含cctype头文件,以使用其中多种判断字符特性的函数
#include <cctype>
//声明使用一系列用得到的函数名字
using std::isupper; using std::toupper;
using std::islower; using std::tolower;
using std::isalpha; using std::isspace;#include <iostream>
//声明使用cout、endl
using std::cout; using std::endl;int main()
{string s("Hello World!!!");//punct_cnt的类型是string::size_type,与string成员函数size的返回值相同//string::size_type是string类定义的配套的类型,能够放下任何string对象的大小string::size_type punct_cnt = 0; //统计s中标点符号的个数//使用for循环对s中的每个元素(字符)进行遍历/*判断条件:c的值不等于s的大小,说明还未遍历完整个string同时c的值也可以作为s的下标用于随机访问*/for (string::size_type c = 0; c != s.size(); ++c)if (ispunct(s[c]))   //如果s中下标为c的字符是标点符号++punct_cnt;     //则增加标点符号的统计数cout << punct_cnt << " punctuation characters in " << s << endl;//备份sstring orig = s;//使s中每个字符都变成大写的形式for (string::size_type c = 0; c != s.size(); ++c)s[c] = toupper(s[c]);  //s[c]返回一个引用以改变s中的元素cout << s << endl;//下面是使s中的第一个单词变成大写的形式s = orig;  //还原sstring::size_type index = 0;//执行循环直到s结束或遇到第一个空白(即读完第一个单词)while (index != s.size() && !isspace(s[index])) {s[index] = toupper(s[index]);  //使字符变成大写的形式++index;                       //移动到下一个字符,进行下一轮循环}cout << s << endl;system("pause");return 0;
}

punctRemove.cpp

#include <iostream>
#include <string>
#include <cctype>
//声明使用命名空间std中的名字using namespace std;int main()
{//声明string类型s、result//s用于存储读入的字符串//esult用于存储除去s中标点符号后的结果string s,result;cout << "Please enter a string,it's best to include some punctuation marks. " << endl;getline(cin,s);  //读入字符串//decltype类型指示符用于选择并返回其操作表达式的数据类型//在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值//一般不知道使用何种类型的变量时,可以使用此指示符自动计算数据类型//此处i的类型是string成员函数size的返回类型:string::size_typefor(decltype(s.size()) i = 0 ; i < s.size(); i++){if(!ispunct(s[i]))   //如果s[i]不是标点符号result += s[i];  //则把该字符添加到result中}cout << result << endl;  //输出结果system("pause");return 0;
}

char_repl.cpp

#include <string>
//声明使用string
using std::string;//包含cctype头文件,以使用其中多种判断字符特性的函数
#include <cctype>
//声明使用一系列用得到的函数名字
using std::isupper; using std::toupper;
using std::islower; using std::tolower;
using std::isalpha; using std::isspace;#include <iostream>
//声明使用cout、endl
using std::cout; using std::endl;int main()
{string str("some string"), orig = str;      //orig是str的备份if (!str.empty())                          //确保str有存储输入cout << str[0] << endl;                 //输出str的第一个字符if (!str.empty())                          //确保str的第一个字符不为空str[0] = toupper(str[0]);              //使第一个字符变成大写形式cout << str << endl;                      //输出strstr = orig;                                 //还原str//用迭代器来实现上述功能if (str.begin() != str.end()) {                //确保str有存储输入的另一种形式string::iterator it = str.begin();       //string的迭代器it指向str的首元素*it = toupper(*it);                     //通过解引用迭代器实现第一个字符大写化}cout << str << endl;                       //输出strstr = orig;                                 //还原str//大写化str中第一个单词的四种方法://1.使用for循环并通过下标的形式//index的类型是string::size_type,与string成员函数size的返回值相同,作为下标for (string::size_type index = 0; //判断条件:当index不等于str的大小,且以index为下标的元素不是空白时执行语句index != str.size() && !isspace(str[index]); ++index) str[index] = toupper(str[index]);   //大写化当前字符cout << str << endl;                     //输出strstr = orig;                                 //还原str//2.使用for循环并使用迭代器取代使用下标//string的迭代器it指向str的首元素//判断条件:当it不指向str的尾后元素,且it指向的元素不是空白时执行语句for (string::iterator it = str.begin(); it != str.end() && !isspace(*it); ++it)*it = toupper(*it);                       //通过解引用迭代器实现字符大写化cout << str << endl;                       //输出strstr = orig;                                 //还原str//3.使用while循环并通过下标的形式//index的类型是string::size_type,与string成员函数size的返回值相同,作为下标string::size_type index = 0;//判断条件:当index不等于str的大小,且以index为下标的元素不是空白时执行语句while (index != str.size() && !isspace(str[index])) {str[index] = toupper(str[index]);       //大写化当前字符++index;                             //增加下标值以获得下一个字符}cout << str << endl;                        //输出str//4.使用while循环并使用迭代器取代使用下标//string的迭代器beg指向str的首元素string::iterator beg = str.begin();//判断条件:当beg不指向str的尾后元素,且beg指向的元素不是空白时执行语句while (beg != str.end() && !isspace(*beg)) {*beg = toupper(*beg);                  //通过解引用迭代器实现字符大写化++beg;                                   //使迭代器指向下一个元素}cout << str << endl;                      //输出strstr = orig;                                 //还原str//使用for循环操作str中的每个字符//首先是每行输出str中的一个字符,使用的是常量迭代器,不会改变其所指向的元素for (string::const_iterator c = str.begin(); c != str.end(); ++c)cout << *c << endl;                       //通过解引用每行输出一个字符//改变str中的每个字符,使用的是可以改变其指向元素的迭代器for (string::iterator c = str.begin(); c != str.end(); ++c)*c = '*';                                //通过解引用迭代器将每个字符变为'*'cout << str << endl;                      //输出strstr = orig;                                 //还原str//用下标实现上述功能//首先是每行输出str中的一个字符for (string::size_type ix = 0; ix != str.size(); ++ix)cout << str[ix] << endl;              //使用下标每行输出一个字符//改变str中的每个字符for (string::size_type ix = 0; ix != str.size(); ++ix)str[ix] = '*';                          //通过下标将每个字符变为'*'cout << str << endl;                      //输出strstr = orig;                                 //还原str//使用for循环和迭代器实现上述功能//首先是每行输出str中的一个字符,使用的是常量迭代器,不会改变其所指向的元素for (string::const_iterator beg = str.begin(); beg != str.end(); ++beg)cout << *beg << endl;                    //通过解引用每行输出一个字符//改变str中的每个字符for (string::iterator beg = str.begin(); beg != str.end(); ++beg)*beg = '*';                             //通过解引用迭代器将每个字符变为'*'cout << str << endl;                      //输出strsystem("pause");return 0;
}

标准库类型string的基本功能和使用相关推荐

  1. C++primer 第 3 章 字符串、向量和数组 3.1 命名空间的using声明 3.2标准库类型string

    引言 除了第2章介绍的内置类型之外,C++语言还定义了 -个内容丰富的抽象数据类型库.其中,string和 vector是两种最重耍的标准库类型,前者支持可变长字符串,后者则 表示可变长的集合.还有- ...

  2. C++ 标准库类型 string

    C++ 标准库类型 string 一.string 类型的使用和定义 1.使用 string 类型 标准库类型 string 表示可变长的字符序列 #include <string> us ...

  3. 谈谈两种标准库类型---string和vector

    两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列. 一.标准库 ...

  4. C++ primer三章二节标准库类型string

    标准库类型string 标准库类型string表示可变长的字符序列,使用#include<string>引入头文件,string定义在命名空间std中. 定义和初始化string对象 如何 ...

  5. c++ 标准库类型string

    标准库类型string string表示可变长的字符序列,使用string类型必须首先包含string头文件. 文章目录 一.定义和初始化string对象 二.操作string对象 三.处理strin ...

  6. 【C++学习笔记】标准库类型string

      标准库类型string表示可变长的字符序列,使用string类型必须先包含string头文件,string定义在命名空间std. #include <string> using std ...

  7. (复健计划)标准库类型string

    标准库类型string表示可变长的字符序列,使用string类型必须包含sring头文件<string>.作为标准库的一部分,string定义在命名空间,string定义在命名空间std中 ...

  8. C++ 标准库类型 string

    写在前面: 我是「虐猫人薛定谔i」,一个不满足于现状,有梦想,有追求的00后 \quad 本博客主要记录和分享自己毕生所学的知识,欢迎关注,第一时间获取更新. \quad 不忘初心,方得始终.自己的梦 ...

  9. 标准库类型String,Vector

    string对象中每个字符的处理: 要用到 for(声明:表达式) 语句 比如简单的打印string str中每一个字符 --- string str("hello world!!!&quo ...

最新文章

  1. 边缘计算Edage Computing
  2. python-学习 协程函数 模块与包
  3. OpenResty安装--增强版的nginx
  4. sql count用法_SQL是一门手艺
  5. [JZOJ P1288] [DP]矩阵取数
  6. 原生安卓与html 好坏,安卓非原生 系统体验差别大
  7. Object-C学习(一)——类别的创建、实现及调用
  8. 数字证书、ssl、sasl(GSSAPI,Kerberos)、jaas简单解释
  9. Web 方向学习路线
  10. Linux 编译安装 openssl库
  11. 计算机学院实习报告3000字(Java开发实习)--持续更新中,多个专业,以及版本
  12. left()函数、right()函数与substr()函数
  13. 库存盘点遗失设备寻找中的个人收获
  14. vba学习系列(2)--以文本存储的数字转为数字格式
  15. python之sklearn学习笔记
  16. [转] 教师的备课主要解决哪些问题?
  17. 金陵科技学院计算机组成考试,2017-2017年度金陵科技学院材料期末考试整理.doc...
  18. 申报高新技术企业的好处
  19. Microsoft SQL Server 实现数据透视表
  20. JS18-解决案例中this、for、for...in的问题

热门文章

  1. 1. Spring boot 之热部署
  2. linux系统下开机启动流程
  3. 什么叫「人的格局」?是否有必要培养大的格局或怎么培养?
  4. LeetCode Algorithm 203. 移除链表元素
  5. 2018/Province_Java_C/3/字母阵列
  6. 111. Minimum Depth of Binary Tree 二叉树的最小深度
  7. 2013\Province_C_C++_A\7.错误票据
  8. Flask 项目布局
  9. 《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案
  10. LeetCode Algorithm 206. 反转链表