(8)string对象上的操作1
读写操作
//读写string对象的测试。
//本程序输入两string类,输出两string类。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
//未初始化的为空string
std::string s, ss;
//和以前一样,">>"最终会返回左侧操作符(先把键盘输入存入对象再返回操作符),所以可以连续输入和输出。
/*
*执行读取操作时,string对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下个空白为止。
*这意味着你输入“ 哈哈 ”,输出的是没有空格的“哈哈”。
*/
cin >> s >> ss;
/*
*如果s存了一个字符,s[2]不存在,则程序运行到这崩溃;
*如果s存了2个字符,s[2]输出空字符。
*/
cout << "——" << s[2] << "——" << endl;
//输出的字符串不会输出空字符。
cout << s << ss << endl;
system("pause");
return 0;
}
//读取未知数量的string对象的测试。
//本程序不限制输入的string类数量,且每次输入后会立即输出输入作为结果。
/*
*注意,这里的未知数量指的不是未知字符串,而是string对象——可以这样理解,一个string对象存的字符串、数字等是不能出现空格的。
*(这个理解是错的,因为马上后面的getline函数就可以实现保存空白符的功能。真正的理解是,一个对象可以保持相当数量的字符串,所以字符串的长短和对象的多少没有关系)
*/
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
std::string word;
//非法输入或者文件终止符:ctrl+z可以终止循环 。
while (cin >> word)
/*
*和我原来想的不一样....我原来以为是全部输入完了再输出,我错了,这是一个while,每次输入都会执行其体内的语句。
*仔细想想这好像是个不应该存在的功能。你输入的内容并不需要当作输出再输出一次,因为你输入的内容本身就可以显示在屏幕上了。
*所以只需要是一个没有循环体的while (cin >> word)就可以把你想显示在屏幕上的内容显示出来了。
*/
cout << word << endl;
}
getline函数
//getline在string对象上的使用。
//本程序可以实现一整行的输出(虽然现在看来输入一行然后再输出一行一摸一样的东西好像没什么用),或者说是包含空白符的string对象的输出。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
std::string s;
/*getline函数
*1.参数是一个输入流和一个string对象:getline(cin,s)。
*2.当我们希望能在最终得到的字符串中保留输入的空白符时,用他代替">>"运算符。
*3.这个函数的操作是:从给定输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读内容存入string对象中(不存换行符)。
* 即这个触发getline函数返回的那个换行符实际上被丢弃了,所以得到的string对象并不包含这个换行符(虽然读取了,但是读取的目地只是触发函数返回)。
*/
/*为什么getline函数能和cin一样作为判断条件?
*因为和cin运算符一样,getline返回的是一个流参数——我的理解是(不一定对):cin返回的是cin这个流本身,getline返回的是一个输入流(换行符触发返回,把输入流存入string对象后返回流然后结束。)。
*/
//这个函数在命名空间中,所以还是得声明这个空间才能调用。
//如果输入的第一个字符是换行符,则s是一个空string。
while (std::getline(cin, s))
//注意这里cout还是输出s而不是整个getline函数!即getline函数的作用是体现在“把输入的东西存入string对象(包括空白符)”。
cout << s << endl;
return 0;
}
string对象,或者说靠cin操作符、getline函数输入的内容都不可能有换行符,因为换行符在这两东西的定义中都代表了“输入结束”的意思。
要注意的一点是,有些操作是定义在命名空间std里的,而有些操作是string类里的成员函数所定义的操作(比如接下来要说的empty函数),这两种是不一样的,虽然都是对string类的操作,所以在使用的方法上也是有区别的。
string的成员函数empty和size的操作
//empty函数——根据string对象是否为空返回一个布尔值
//本程序只输出非空行
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
std::string s;
while (std::getline(cin, s))
{
//这个if理解为:s.empty()=1【是空的】--》if(!1)——即如果【if】(s【s.empty】不是【!】一个空string)就执if函数体。
if (!s.empty())
cout << s << endl;
else
cout << "error" << endl;
}
return 0;
}
//size函数——返回字符串长度
//本程序只输出超过一定长度的string对象。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
std::string s;
while (std::getline(cin, s))
{
/*
*如果输入的字符串长度大于2,则执行if函数体。注意,这个大于2和s[2]这个操作中的2不一样:
*输入abc,字符串长度是3(不包括最后的空字符),而s[n]中的n最高虽然也能到3,但s[3]是空字符——因为是从0开始计数,s[0]是“a“.
*/
if (s.size() > 2)
cout << s << endl;
else
{
//这里即验证了s[2]中的数字和字符串长度一样时会发生什么
cout << "in less then size of string " << endl;
cout << s[2] << endl;
}
}
return 0;
}
关于size函数的补充:string::size_type类型
对于size函数来说,返回的值既不是int类型也不是unsigned类型,而是string::size_type类型。string类及其她大多数标准库类型都定义了几种配套类型。
这些类型体现了标准库类型与机器无关的特性————这句话暂时这么理解:既然是C++自己根据自己库建立的类型,那么肯定机器无关,即任何机器只要有C++语言,就可以定义这些类型。也可以这么看,只有C++的那些库类型才需要这些相应的类型,没有那些库类型的就没有这些东西的必要。
string::size_type类型是定义在string中的,所以具体使用的时候要这样:
std::string::size_type;
尽管我们现在还不清楚这种类型的细节,但有一点我们需要知道:它是一个无符号的值,且能足够放下任何string对象的大小——所有size函数返回值的类型都是它。
过去这种类型不好使用和理解,现在C++11新标准中已经允许我们用auto或者decltype来推断变量的类型了,比如:
auto len = s.size(); //len类型是string::size_type
特别注意的是,下面这种代码会出现意想不到的结果:
if (s.size() < -2)
cout << s << endl;
知道为什么么?
注意(敲重点),size函数返回的是一个无符号数!用她来和一个带符号的负数进行比较会出现问题的,因为这个带符号的负数会转化成一个及其大的无符号值!
换句话说,一条表达式中有了size函数就不要再用int类型的值了——这样说来,前面的这段代码:
if (s.size() > 2)
cout << s << endl;
这里面的2岂不是无符号数?我猜这是一个临时值2,或者说是传说中的纯右值~
(8)string对象上的操作1的更多相关文章
- (9)string对象上的操作2
比较string对象的比较运算符 这种由string类定义的几种比较字符串的运算符能逐一比较string对象中的字符(对大小写敏感).
- string 对象及其操作
标准库类型string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准库的一部分,string定义在命名空间std中.接下来的示例都假定了已包 ...
- C风格字符串和C++ string 对象赋值操作的性能比较
<<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: # ...
- String 类上的常用操作
java 中String 类上的常用操作: 首先创建对象 String line = new String("String demo"); String line2 = new ...
- Javascript进阶篇——( JavaScript内置对象---上-Date,string,charAt,indexOf,split,substring,substr)笔记整理
什么是对象JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法.对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等:对象的方法:能够在 ...
- Python把json格式的string对象转变成dict对象操作、Python3不能使用urllib2、urllib.parse.urlencode(params).encode(encoding='UTF8')
son格式的string对象转变成dict对象操作 content=eval(content)#json字典转化 Python3不能使用urllib2 直接使用urllib.request替换urll ...
- js String对象中常用方法小结(字符串操作)
1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...
- C++ STL string对象操作汇总
string对象 C语言只提供了一个char类型用来处理字符,而对于字符串,只能通过字符串数组来处理,显得十分不便.C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为 ...
- 原生JS:String对象详解
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
随机推荐
- E-SATA接口
1.VGA接口 VGA接口就是显卡上输出模拟信号的接口,也叫D-Sub接口,其实就是显示转移的接口,比如连接投影仪.连接电视等等.从外观上讲,VGA接口是一种D型接口,上面共有15针空,分成三排,每排 ...
- Symantec Backup Exec部署手册
转载 http://xiaxiaoguo.blog.51cto.com/858884/402810 Symantec Backup Exec部署手册 目录 1.Backup Exec 12.5安装. ...
- HDU 3280 Equal Sum Partitions(二分查找)
Equal Sum Partitions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- TCP从连接到释放过程全解
參考书籍:<计算机网络第5版> TCP是面向连接的协议,採用C/S模型建立连接,由client主动发起连接请求,server端允许请求的模式建立连接,通常称为三次握手建立TCP连接. 准备 ...
- 有时候当你改动了xib   你调试,各种改的时候又没变化的时候
当你xib 改变了 调试的时候又没变化的时候,当你各种改错无用的时候,就是xcode xib的缓存问题了. please clear xcode . command + shift + K . ...
- linux恢复误删除文件-extundelete
经过本人測试该工具支持ext3和ext4文件系统 当发现某个分区的数据被误删除后.要做的第一件事是立马卸载被误删除文件所在的分区,或者又一次以仅仅读方式挂载此分区. 这么做的原因事实上非常eas ...
- opencv基础笔记(1)
为了细致掌握程明明CVPR 2014 oral文章:BING: Binarized Normed Gradients for Objectness Estimation at 300fps的代码,的好 ...
- 使用Hibernate防止SQL注入的方法
之前写代码,往后台传入一个组织好的String类型的Hql或者Sql语句,去执行. 这样其实是很蠢的一种做法!!!! 举个栗子~~ 我们模仿一下用户登录的场景: 常见的做法是将前台获取到的用户名和密码 ...
- 【bzoj4385】[POI2015]Wilcze doły
单调队列扫描,记录当前区间长度为d的一段的和的最大值,和当前区间和. #include<algorithm> #include<iostream> #include<cs ...
- lvm调整分区大小
1 问题 /home分区占用空间比较大,而/var分区比较小,它们位于同一个磁盘上.该系统安装了lvm. 2 减少/home分区空间 2.1 卸载/home umount /home 2.2 检查文件 ...