c++primer学习笔记(3.2)标准库string类型

来源:互联网 发布:北方数据 股票 编辑:程序博客网 时间:2024/04/30 09:43

3.2标准库string类型

初始化string类型的方式: 

string s1;                     // 默认构造函数,s1为空串

string s2(s1);    // s2初始化为s1的一个副本

string s3("value");     // s3初始化为一个字符串字面值副本

string s4(n, 'c');         // s4初始化为字符'c'n个副本

字符串字面值与标准库string类型不是同一种类型。

String类型的输入操作符:1读取并忽略开头所有空格;

                                              2读取字符串直至再次遇到空白字符

如:

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


如果输入Hello world!将只输出Hello     //前后都无空格

Int s1,s2,s3;

cin>>s1>>s2>>s3;

cin返回左操作数作为结果,故可以连续读取!

读入位置数目的字符串并打印,每行输出一个单词:

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


getline(cin,line),需要两个参数,一个istream,一个string对象。

一次读取一行文本

由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。

读入一行文本,打印:

#include <iostream>#include<string>using namespace std; int main(){string line;while(getline(cin,line))cout<<line<<endl; return 0; }


string对象的操作

s.empty()// 如果s为空串,则返回true,否则返回false

s.size()   // 返回s中字符的个数

s[n]// 返回s中位置为n的字符,位置从0开始计数

s1+s2    //s1s2连接成一个新字符串

s1=s2    //s1的内容替换为s2的内容

v1==v2  //比较v1v2的内容,相同返回true不同false

!=<<=>>=   //同上


s.size()返回的类型为string::size_type类型,这样做的目的是为了使库类型的使用与机器无关。不要把size的返回值当作int整型!!

string line1("asdf");

string line2="ghhjkl";

line1=line1+line2;     //两个string相加

string line3=line1+","+line2;   //也可以和字符串字面值相加,line3asdf,ghhjkl

不过,+操作符有使用限制,两边必须有一个是string

String line4="hello"+",world"  //erro 错误!!


使用s.[cnt]运算符,下标,索引index,从0开始:

#include <iostream>#include<string>using namespace std;using std::string; int main(){string line1("asdf");    string line2="ghhjkl";    line1=line1+line2;    string line3=line1+","+line2;    for(int cnt=0;cnt<line3.size()-1;cnt++)cout<<line3[cnt]; return 0; }


也可以进行对下标操作的直接赋值:

line3[cnt]='8';

下表操作符类型为string::size_type,但[ ]内可以使用int

索引index千万不要超出size-1,未定义,dangerous!!

string对象中字符的处理

    isalnum(c)    isalpha(c)    iscntrl(c)    isdigit(c)

  isgraph(c)    islower(c)    isprint(c)    ispunct(c)

  isspace(c)    isupper(c)    isxdigit(c)

  tolower(c)    toupper(c)


测试字符串中标点符号的个数:

#include <iostream>#include<string>using namespace std;using std::string; int main(){string s("Hello world!!!");string::size_type punct_cont=0;for(string::size_type index=0;index!=s.size();index++){if(ispunct(s[index]))  ++punct_cont;}cout<<punct_cont<<" punctuation characters in "<<s<<endl; return 0; }


将字符串中的小写改成大写;

#include <iostream>#include<string>using namespace std;using std::string; int main(){string s("Hello world!!!");for(string::size_type index=0;index!=s.size();index++){s[index]=toupper(s[index]);//toupper函数仅仅是返回一个大写的字符,不会改变原有的字符值,需要赋值来改变}cout<<s<<endl; return 0; }


习题3.7

//比较string的大小#include <iostream>#include<string>using namespace std;using std::string; int main(){string s1,s2,max;cout<<"input two strings:"<<endl;cin>>s1>>s2;if(s1!=s2){  if(s1>s2){   max=s1;  }  else  max=s2;  cout<<"the bigger one is "<<max<<endl;}elsecout<<"the two strings are equal!"<<endl; return 0; }


改写程序测试长度:

#include <iostream>#include<string>using namespace std;using std::string; int main(){string s1,s2,max;cout<<"input two strings:"<<endl;cin>>s1>>s2;if(s1.size()!=s2.size()){  if(s1.size()>s2.size()){   max=s1;  }  else  max=s2;  cout<<"the longer one is "<<max<<endl;}elsecout<<"the two strings are equal!"<<endl; return 0; }


习题3.8

//连接多个string对象#include <iostream>#include<string>using namespace std;using std::string; int main(){string s,res;cout<<"please input many strings:"<<endl;while(cin>>s){res+=s;}cout<<"after putting them toghter,they are:"<<res<<endl; return 0; }


改动后,每个string之间加上空格

#include <iostream>#include<string>using namespace std;using std::string; int main(){string s,res;cout<<"please input many strings:"<<endl;while(cin>>s){res+=' '+s;}cout<<"after putting them toghter,they are:"<<res<<endl; return 0; }


习题3.10

//去除标点符号#include <iostream>#include<string>#include<cctype>using namespace std;using std::string; int main(){string s,res;cout<<"please input a string(with punctions:"<<endl;cin>>s;for(string::size_type index=0;index<s.size();index++){if(!ispunct(s[index])){res=res+s[index];}} cout<<"strip the punctions:"<<res; return 0; }


原创粉丝点击