(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 ...
随机推荐
- 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成
前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...
- 剑指Offer —— BFS 宽度优先打印
https://www.nowcoder.net/practice/7fe2212963db4790b57431d9ed259701?tpId=13&tqId=11175&tPage= ...
- IOS开发UI篇--一个支持图文混排的ActionSheet
一.简单介绍 UIActionSheet是IOS提供给我们开发人员的底部弹出菜单控件.一般用于菜单选择.操作确认.删除确认等功能.IOS官方提供的下面方式对UIActionView进行实例化: - ( ...
- pageContext 获取Session 为null原因
问题:在J2EE应用中.发如今自己定义标签中取不到session: HttpSession session = pageContext.getSession(); 你会发现session的值可能是空的 ...
- IDM百度云使用
2018-8-6 (idm百度云速度很慢) Tips:如果感觉图片较小,可以ctrl+鼠标滚轮放大网页 首先下载IDM绿色版. 解压后:右键以管理员权限运行进行绿化 最后,它会在所有支持的浏览器上安装 ...
- matlab Newton method
% Matlab script to illustrate Newton's method % to solve a nonlinear equation % this particular scri ...
- php把时间计算成几分钟前,几小时前,几天前的函数
function time_tran($the_time){ $now_time = date("Y-m-d H:i:s",time()+8*60*60); $now_time = ...
- start com.android.settings/com.android.settings.SubSettings activity
1. get class name: adb shell shell@android:/mnt/sdcard/books $ dumpsys window windows >dump.txt g ...
- 2015ACM/ICPC Asia Regional Changchun Online /HDU 5438 图
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 1310 ...
- Noip模拟 Day6.13 By LD T1
一.哲哲回家 出题人的解答: 可以将其转化成最短路模型. 这个地方转车怎么转移有点困难,有两种方法: 1.我们可以再把每一个点拆成M个点,我们用F[i,j]表示从1号点到i这个点并且坐在j路车上的最少 ...