C++primer 3.2 标准库类型string(sizeof的使用)

简介

  1. string 表示可变长的字符序列,使用之前必须包含string头文件 include < string >;

  2. string对象中字符的处理—–对string中对象进行处理的的函数都在cctype 头文件中定义 include < cctype>

  3. size()函数返回string对象的长度,即string对象中字符的个数,如s1=”abc”,则个数为3,不包括末尾的空字符;(5.8节还会学到)

  4. 下标操作符也是一个string: :size_type类型的值

========================================================================================================================

一、命名空间using的使用

  1. 我们使用的库函数基本上都是属于命名空间std,std::cin 表示从标准输入中读取内容。:: 作用域运算符的含义是从操作符的左侧名字所示的作用域中寻找右侧那个名字
  2. 我们可以通过更简单的途径来使用命名空间中的成员,通过using 声明;
  3. using std:cin 那我们就可以在命名空间std中获取它,我们可以直接使用cin,而不用写成std::cin来执行输入,。
  4. 头文件不应包含using 声明
    位于头文件的代码会拷贝到所有引用它的文件中去,如果头文件里有某个using 声明,那么每个使用了该头文件的文件就都会有这个声明。会产生始料未及的名字冲突。

二、标准库类型string — 可变长的字符序列

前面介绍的内置类型是由C++语言直接定义的,这些类型,如数字和字符,体现了大多数计算机硬件本身具备的能力。标准库定义了另外一组具有更高级性质的类型,他们尚未直接实现到计算机硬件中。

1. string 表示可变长的字符序列,使用之前必须包含string头文件

2. 作为标准库的一部分,string定义在命名空间std中

  **#include <string>**
  **using std::string**

3. 定义和初始化string对象

这里写图片描述

string s1; //s1默认是空串
string s2(s1);
string s2=s1;
string s3("values")**;s3是values的副本,除了字面值最后的那个空字符串外**
string s3="values";
string s4(n,'c');

4. string 对象的操作

(1)读写string对象:从第一个真正字符(非空格、换行、制表符)开始,遇到空白停止
int main()
{
string s1;
cin>>s1;
cout<<s1<<endl;
return 0;}
//输入 abc   def 
//结果:abc  因为遇到空白就停止了,所以s1=”abc“;
//ctrl + z 表示输入结束
//可以有多个输入和多个输出(常用的)
  string s1,s2;
  cin>>s1>>s2;      
  cout<<s1<<s2<<endl;
  //输入 abc   def
  //结果:abcdef
(2)读取未知数目的string对象,就是多个string对象;

读取未知数量的string对象和读取未知数量的int一样。

 int main ()
  {
string word;
while(cin>>word)
cout<<word<<endl;
return 0;
}
//输入:dec def  ede
//输出:dec def  ede
(3)使用getline(cin,s1)读取一整行,通过getline函数,我们可以得到字符串中保留输入时的空白符。一行一行的读,遇到换行符结束
int main()
{
string line;
while(getline(cin,line))
cout<<line<<endl;
}
//输入 abc  cde  edf
//输出 abc  cde  edf

这里写图片描述

(4)string中的empty和size操作
  • empty()用来判断是否为空。

  • size()函数返回string对象的长度,即string对象中字符的个数,如s1=”abc”,则个数为3;

(5)string::size_type类型
  • 对于size函数来说,其返回值类型是一个string::size_type 类型的值;

  • string 类型及其他大多数标准库类型都定义了几种配套的类型,这些类型体现了标准库类型与机器无关的特性,size_type 就是其中的一种。在具体使用的时候,通过作用域操作符来表明名字size_type是在类string中定义的。

  • size_type 是一种unsigned 类型的值,而且能够放下任何string对象的大小。

  • 所有用于存放string类的size函数返回值的变量,都应该是string: : size_type类 型的

  • 因为size 函数返回的是无符号类型的,所以在表达式中最好不要混用带符号和无符号数,在一个表达式中如果有size ()函数了,就不要再使用int 了
(6)比较string对象大小
  • 注意:大小和长度不一样,长度是用size函数的,大小就直接用关系运算符进行比较

    • a. 比较两个string对象通过关系运算符 > < >= == ;

    • b. 如果两个string对象长度不同,且较短的string对象的每个字符都与较长string对象对应位置上的字符相同,就说较短string对象小于较长string对象;

    • c. 如果两个string对象在某些对应的位置上不一致,则string对象比较结果其实是string对象中第一对相异字符比较的结果。

(7)为string对象赋值
(8)两个string对象相加

两个string对象的相加其实就是string对象的串接

int main ()
{
string result_str,str;
while(cin>>str)
{result_str=result_str+str;}
cout<<result_str<<endl;
return 0;
}
//输入:abc  cde  efg  (ctrl+z结束)
//输出:abccdeefg
(9)字面值与string对象的相加
  • 字符串和string是不同的类型!!!!!!!!!!

  • 当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string。

string  s2=s1+","  //可以
string  s3="hello " +" , " //不可以
string  s4=s2+","+"world" //可以
string  s5="hello"+","+s2 // 不可以
(10)数字不能与string对象的相加

5.string对象获取字符

(1)通过下标操作获取字符
  • string类型通过下标操作符来访问string对象中的字符。下标操作符也是一个size_type类型的值,这个下标中的值称为“索引”或“下标”,所以这里的索引是unsigned类型的string : : size_type

  • string对象的下标都是从0开始的(所以前提就是s 非空)

  • 如果s 是一个string对象且 s 不为空则s[0] 就是字符串的第一个字符,s[1] 表示第二个,而s[s.size()-1]则表示最后一个。



  int main ()
{
string str("some string");
for(string::size_type ix=0;ix<str.size();ix++)
{cout<<str[ix]<<endl;}
return 0;
}
//下面这样操作是错误的,因为str1是空的!!!
string str1;
cout<<str1[0]<<endl;
(2)string对象中字符的处理

对string中对象进行处理的的函数都在cctype 头文件中定义 include

常见的函数有 isalnum,isalpha,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace

这里写图片描述



int main ()
{
string str("some string!!!!!!");
string::size_type punct_cnt=0;
for(string::size_type ix=0;ix<str.size();ix++)
{
    if(ispunct(str[ix])) //这个是得到string对象中标点符号个数的函数
      punct_cnt++;
}
cout<< punct_cnt<<endl;
return 0;
}

 //编一个程序,从string 对象中去掉标点符号。要求输入到程序的字符串必须含
//有标点符号,输出结果则是去掉标点符号后的string 对象。
  int main ()
{
string result_str,str;
while(cin>>str)        //用while实现
{  for(string::size_type i=0;i!=str.size();i++)
    if (!ispunct(str[i]))
    result_str=result_str+str[i];
}
cout<<result_str<<endl;
return 0;
}
string result_str,str;
getline(cin,str);    //用getline实现
{  for(string::size_type i=0;i!=str.size();i++)
    if (!ispunct(str[i]))
    result_str=result_str+str[i];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值