查漏补缺——字符串、数组

1、读写字符串string对象的操作

(1)在执行读取操作时(cin>>str),string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白为止

(2)如果要读取未知数量的string对象,使用while(cin>>str)就会反复读取,直至遇到文件的结束标记或非法输入。这个点虽然很小,但是我很容易搞错,要注意。

(3)有时候需要读取一行并保留其中的空格,那么使用getline(cin,str),表示函数从指定的输入流cin中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入那个string对象中去(注意不存换行符)。getline一遇到换行符就结束读取并返回结果,哪怕输入的一开始就是换行符也是如此,这种情况下结果是空字符串。同样,我们可以使用while(getline(cin,str))进行反复读取一行直至达到文件末尾。


2、string的empty和size操作

str.empty()根据string对象是否为空返回一个bool值。

str.size()返回string对象的长度(字符的个数),其实size函数返回的是sting::size_type类型的值,一般使用auto或decltype来推断变量的类型

auto len=str.size();

注意:如果一条表达式中已经有了size()函数,就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。因为在判断s.size()<n时,若n为具有负值的int,则判断结果几乎肯定是true的,因为负值n会自动转换成一个比较大的无符号值。


3、处理string对象中的字符

在cctype头文件中定义了一组标准库函数处理某个字符的特性:isalpha(c),isdigit(c),islower(c),isspace(c),isupper(c),tolower(c),toupper(c)等

基于范围的for语句使用非常方便,如:for(auto &c : str){c=toupper(c);}

注意:要想改变string对象中字符的值,必须把循环变量定义成引用类型

范围for语句体内不应该改变其所遍历的序列的大小。如果循环体内包含向例如vector对象添加元素的语句,如push_back,则不能使用范围for语句。使用范围for语句也是确保下标合法(预防缓冲区溢出)的一种合理手段。


4、数组

(1)在定义数组的时候,必须指定数组的类型,不允许使用auto关键字由初始值的列表推断类型。另外和vector一样,数组的元素应为对象,因此不存在引用的数组。

(2)不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。

(3)与vector和string一样,当需要遍历数组的所有元素时,最好的办法是使用范围for语句,此外,而且在使用下标访问数组时,下标是否在合理范围之内由程序员负责检查。

(4)数组内置的下标运算符所用的索引值不是无符号类型,这一点与vector和string不一样,内置的下标运算符可以处理负值,表示相对当前位置向前的多少位置,当然结果地址必须指定原来指针所指向同一数组中的元素。

(5)我们知道,不允许使用一个数组为另一个内置类型的数组赋初值,也不允许一个vector对象初始化数组,但是,允许使用数组来初始化vector对象,只要指明拷贝区域的首地址和尾后地址就可以了:vector<int> ivec(begin(int_arr),end(int_arr));

其中:C++11引入两个名为begin和end的函数可以得到一个数组首元素的指针和数组尾后位置的指针。和vector等的begin()、end()不同,这两个是函数而非成员函数。

(6)要使用范围for语句处理多维数组,除了最内层的循环外,其他所有的循环的控制变量都应该基于引用类型,这样避免数组被自动转为指针;如果要改变元素的值,要把所有的控制变量都声明成引用才可以。

建议:现在的C++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;应该尽量使用string,避免使用C风格的基于数组的字符串(以空字符结束的字符数组)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值