标准库类型string的基本功能和使用
标准库类型string的基本功能和使用
- String基本知识
- 初始化
- 基本操作
- 范围for语句
- string定义的迭代器及其他
- 关于下标操作
- 示例代码
- 练习3.6
- cctype.cpp
- punctRemove.cpp
- char_repl.cpp
本文是本人大一期间在校学习C++课程时所撰写的实验报告的摘录,由于刚上大学,刚接触计算机编程方面的相关知识,故可能会有很多不足甚至错误的地方,还请各位看官指出及纠正。
本文所涉及到的“教材”指:
电子工业出版社《C++ Primary中文版(第5版)》
如需转载或引用请标明出处。
String基本知识
标准库类型string表示可变长的字符序列,其类型与C语言中的字符串字面值的类型是不同的。与C语言管用的用字符数组表示字符串相比,string的一大特点是其可以改变长度,更有灵活性。
初始化
初始化string对象的方法有很多:
string str1
表示默认初始化,str1是一个空字符串string str2 = str1
表示str2是str1的副本string str3 = “value”
表示str3是字面值”value”的副本,不包括最后的空字符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头文件中包含的一些函数的简单介绍:
isalnum( c )
当c是字母或数字时为真isalpha( c )
当c是字母时为真islower( c )
当c是小写字母时为真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的基本功能和使用相关推荐
- C++primer 第 3 章 字符串、向量和数组 3.1 命名空间的using声明 3.2标准库类型string
引言 除了第2章介绍的内置类型之外,C++语言还定义了 -个内容丰富的抽象数据类型库.其中,string和 vector是两种最重耍的标准库类型,前者支持可变长字符串,后者则 表示可变长的集合.还有- ...
- C++ 标准库类型 string
C++ 标准库类型 string 一.string 类型的使用和定义 1.使用 string 类型 标准库类型 string 表示可变长的字符序列 #include <string> us ...
- 谈谈两种标准库类型---string和vector
两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列. 一.标准库 ...
- C++ primer三章二节标准库类型string
标准库类型string 标准库类型string表示可变长的字符序列,使用#include<string>引入头文件,string定义在命名空间std中. 定义和初始化string对象 如何 ...
- c++ 标准库类型string
标准库类型string string表示可变长的字符序列,使用string类型必须首先包含string头文件. 文章目录 一.定义和初始化string对象 二.操作string对象 三.处理strin ...
- 【C++学习笔记】标准库类型string
标准库类型string表示可变长的字符序列,使用string类型必须先包含string头文件,string定义在命名空间std. #include <string> using std ...
- (复健计划)标准库类型string
标准库类型string表示可变长的字符序列,使用string类型必须包含sring头文件<string>.作为标准库的一部分,string定义在命名空间,string定义在命名空间std中 ...
- C++ 标准库类型 string
写在前面: 我是「虐猫人薛定谔i」,一个不满足于现状,有梦想,有追求的00后 \quad 本博客主要记录和分享自己毕生所学的知识,欢迎关注,第一时间获取更新. \quad 不忘初心,方得始终.自己的梦 ...
- 标准库类型String,Vector
string对象中每个字符的处理: 要用到 for(声明:表达式) 语句 比如简单的打印string str中每一个字符 --- string str("hello world!!!&quo ...
最新文章
- 边缘计算Edage Computing
- python-学习 协程函数 模块与包
- OpenResty安装--增强版的nginx
- sql count用法_SQL是一门手艺
- [JZOJ P1288] [DP]矩阵取数
- 原生安卓与html 好坏,安卓非原生 系统体验差别大
- Object-C学习(一)——类别的创建、实现及调用
- 数字证书、ssl、sasl(GSSAPI,Kerberos)、jaas简单解释
- Web 方向学习路线
- Linux 编译安装 openssl库
- 计算机学院实习报告3000字(Java开发实习)--持续更新中,多个专业,以及版本
- left()函数、right()函数与substr()函数
- 库存盘点遗失设备寻找中的个人收获
- vba学习系列(2)--以文本存储的数字转为数字格式
- python之sklearn学习笔记
- [转] 教师的备课主要解决哪些问题?
- 金陵科技学院计算机组成考试,2017-2017年度金陵科技学院材料期末考试整理.doc...
- 申报高新技术企业的好处
- Microsoft SQL Server 实现数据透视表
- JS18-解决案例中this、for、for...in的问题
热门文章
- 1. Spring boot 之热部署
- linux系统下开机启动流程
- 什么叫「人的格局」?是否有必要培养大的格局或怎么培养?
- LeetCode Algorithm 203. 移除链表元素
- 2018/Province_Java_C/3/字母阵列
- 111. Minimum Depth of Binary Tree 二叉树的最小深度
- 2013\Province_C_C++_A\7.错误票据
- Flask 项目布局
- 《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案
- LeetCode Algorithm 206. 反转链表