第三章 字符串(上) 字符串的定义,初始化与读取数据

目录

3.1 命名空间的using声明

 3.2 标准库类型string(字符串)

一、定义和初始化字符串对象

1.六种方法初始化string对象

2.直接初始化和拷贝初始化

二、string对象的操作

1.string操作

2.string对象引用

3.字符串大小判断 

4.读写string对象

5.使用getline读取一整行

6.string的empty和size操作


3.1 命名空间的using声明

目前我们用到的基本是命名空间std里面的,典型的:输入输出,

std::cin >> a;//使用命名空间std中的名字cin从而输入a
std::cout >> a >> std::endl;使用命名空间std中的cout从而输出a后结束此行

其中,我们要注意的是每个std中的名字都需要写一遍命名空间std。但是,我们有更简洁的方法取而代之:using声明所需要的名字。

#include<iostream>
using std::cin;//显式声明cin
using std::cout;//显式声明cout
using std::endl;//显示声明endl
int main()
{
    int a , b;
    cin >> a >> b;
    cout << "a的值为:" << a << endl << "b的值为:" << b;
    std::cout << "ceshi";//已有显式声明的情况下再写一遍命名空间也可以运行,但不建议
}

总而言之:

1.每个名字都需要独立的声明

2.没写显式声明(上面代码第二至四行)一定要用命名空间加作用域操作符和名字,相反,有了显式声明再去写命名空间等也可以运行。

 3.2 标准库类型string(字符串)

string字符串表示可变长的字符序列,使用string类型必须包含string头文件和命名空间std(因为string定义在命名空间std中),也就是:

#include <string>
using std::string;
一、定义和初始化字符串对象
1.六种方法初始化string对象
string s1;//第一种,默认初始化,s1是一个空字符串
string s2(s1);//第二种,s2是s1的副本
string s2 = s1;//第三种,等价于上一行,s2是s1的副本
string s3("String");//第四种,s3是字面值String的副本
string s3 = "String";//第五种,等价于上一行,s3是String的副本
string s4(n, 'c');//第六种,给一个数字和字符,结果就是n个字符'c'组成的串
2.直接初始化和拷贝初始化

1)形式

string s1("Hello String");//直接初始化
string s2 = "Hello String";//拷贝初始化

换言之,用等号初始化一个变量就是拷贝初始化;反之不使用等号则是直接初始化。

2)适用场景

当一个字符串初始化时要接收多个值时只能用直接初始化,而只有一个值时拷贝初始化或拷贝初始化都可以

3)内在剖析(这里可以自己再去拓展,搞搞清楚直接初始化,拷贝初始化和复制初始化。当然,也可以私信问我)

拷贝初始化的执行过程是先调用一个符合实参类型的构造函数创建一个临时的string对象,再调用拷贝构造函数将这个string对象拷贝给要初始化的对象。

二、string对象的操作
1.string操作
string操作
os<<s将s写到输出流os中,返回os

is>>s

在is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s)从is中读取一行赋给s,返回is
s.empty()判断是否为空,空返回true,非空则为false
s.size()返回s中字符个数
s[n]返回s中第n个字符的引用,n从0开始计数
s1+s2返回s1和s2拼接后的结果
s1=s2用s2的副本代替s1
s1==s2判断s1和s2是否相等
s1!=s2同上,注意:大小写敏感
<、<=、>、>=利用字符在字典中的顺序比较,大小写敏感

2.string对象引用

 等等,一个非常重要的概念是string对象的引用

比如输出一串字符的第n个字符,也就是这样:

#include<iostream>
#include<string>
using std::cin; using std::cout;
using std::string;
int main()
{
	string s = "12345";
	
		cout << s[0] << " ";//输出第1个字符
		cout << s[1] << " ";//输出第2个字符
		cout << s[5] << " ";//输出低6个字符
	
	return 0;
}

先来看一下输出:

1 2 (2后面还有一个空字符)

这个地方,我们输出第一个字符为什么是s[0]呢?其实之前并没有过多了解过,只知道字符串从0开始。但是,经过我查找全网的资料总结得到以下结论:

首先,大家要明白,字符串的范围是左闭右开,也就是:[ 左范围 , 右范围 ),

其次,字符串是一段具有连续内存空间的线性结构,

最后,在这里把下标理解成偏移,换言之,下标是夺少,偏移量就是夺少,而首字符就是初始地址,偏移量为0,第二个字符是偏移量为1的地址,因此第二个字符下标为1。同理,上述代码中s字符串一共有5个字符,所以它的最大偏移量也就是4,所以当我们试图输出是s[5]的时候,就是空的。

综上,字符串的范围是:[ 0 , n ),从0开始,到n结束。

3.字符串大小判断 

对于字符串的比较,我们根据字符在字典中的顺序和ASCII码进行比较,比如a和c,a在字典中靠前,ASCII码为97,相比来说,c在字典中的位置靠后,ASCII码为99,97小于99,所以a<c。同理,字符串"123"和字符串"23"比较,不是用整体数值作比较,而是单个字符比较,"123"和"23"的比较过程为:1和2比较,1<2,所以字符串"123"小于字符串"23"。

#include<iostream>
#include<string>
using std::cin; using std::cout; using std::endl;
using std::string;
int main()
{
	string s1 = "213";
    string s2 = "33";
    string s3 = "abc";
    string s4 = "abd";
    cout << (s2 > s1) << endl;//否
    cout << (s3 > s4) ;
    return 0;
}

 输出为:

1
0

分析以上代码:

第一个输出判断s2是否大于s1时,先将s2的第一个字符"3"与s1的第一个字符"2"比较,答案是显然的,所以第一个判断显然成立,输出为1;

第二个输出判断s3是否大于s4,先将s3第一个字符"a"与s4的第一个字符比较,相等则依次向后比较,再将s3的第二个字符"b"与s4的第二个字符“b”比较,依旧相等;继续比较,也就是s3的下一个字符"c"和s4的下一个字符"d",c的位置靠前,ASCII码为99,而d的位置相对靠后,ASCII码为100.所以s3<s4,与判断条件不符,输出为0。

4.读写string对象

1)与其他内置类型如int,float等的相同,有不同的地方是:cin写入时,会忽略第一个有效字符出现之前的空白(回车,制表符,空格等),直到下一个空白

#include<iostream>
#include<string>
using std::cin;using std::cout; using std::endl;
using std::string;
int main()
{
	string s;
	cin >> s;
	cout << s;
	return 0;
 } 

输入字符:(注意字符中的空格)

          Hello World!

输出字符:

Hello

如果需要输出"Hello World!",则需要两个字符串来盛放,如下:

#include<iostream>
#include<string>
using std::cin;using std::cout; using std::endl;
using std::string;
int main()
{
	string s1, s2;
	cin >> s1 >> s2;
	cout << s1 << " " << s2;
	return 0;
 } 

2)读入未知数量的string对象

与其他内置类型相似,当输入非空时条件成立并进行下一步操作:

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::endl;
using std::string; 
int main()
{
	string s;
	while(cin >> s)
	{
		cout << s << endl;
	}
	return 0;
}
5.使用getline读取一整行

getline,操作如其名,读取一行的数据,直到回车(换行)符,读入的时候换行符也被读入,但是将读入的内容存入string对象里面时丢弃,即不存回车

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::endl ; 
using std::string;
int main()
{
	string s1;
	while (getline(cin , s1))
	    cout << s1 << endl;
	return 0;
}
6.string的empty和size操作

1)empty顾名思义为判空操作,即判断string对象是否为空并返回一个bool值。同时,empty是string的成员函数,使用时须指明是哪个对象执行了empty函数。

改写上面代码,跳过空行,只输出有效行:

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::endl;
using std::string;
int main()
{
	string s;
	while(getline(cin , s))
	{
		if(!s.empty())
			cout << s;
	}
	return 0;
}

2)size,返回string的长度

当然,也可以作为一种判断语句左右语句的执行

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::endl;
using std::string;
int main()
{
	string s;
	while(getline(cin , s))
	if(s.size() > 14)
	cout << s;
	return 0;
}

上述代码中,输入的字符串无论长短,输出的只有长度超过14的,也就是说,可以过滤掉长度短于14的字符串。

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R.S.G.久夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值