1.String对象的初始化

     string    s1;                              默认构造函数,s1为空串
     string    s4(n, 'c');                   将s4初始化为字符c的n个副本
     string    s3(const char,int N)

string s3(const char*,int N);  将s3初始化为一个c常量字符串的前N个字符(至多N个)

     string    s2(s1);                           将s2初始化s1的一个副本。
     string    s5(const string &,int n=0,int N)     s5初始化为常量字符串的以索引n开头的N个字符。
     string    s6(a+6,a+10)        其中a=char[N].以a中[6,10)数据构造。此时c+6,c+10均为指针类型,即此时模板参数为指针类型,故s5+6,s5+10无意义而要用如上的&s5[6],&s5[10](例如string的部分子串)

注意:字符串字面值和string类型不是同一种类型

2.String对象的读取

①iostream标准库读写
      cin>>s从标准输入读取string,并存入串s中。读取并忽略开头的空白字符,读取直至再次遇到空白字符(空格,换行,制表)为止。可以作为条件语句
②getline读取整行文本
     getline(cin,line)-->getline(cin,word,':')。需要两个参数,1个istream,1个string对象。可以用作循环或if控制语句。getline不忽略开头和结尾的空白字符,它只要遇到换行符(即使在开头)停止读入并返回(不读入换行符)。换行符不存储在string对象中。可以指定结束符如‘:’,同样结束符不被读取,但是换行符此时被读取。这个语句不能作为判断语句使用。

3.String对象的常用操作

    s.size()               返回s中字符的个数(成员函数)
    s.empty()       判断字符串是否为空(成员函数)
    s[n]           返回s中位置为n的字符,位置从0开始计数
    s1 + s2         拼接字符串
    s1 = s2         将s1替换成s2的副本
    s1 == s2       比较s1和s2的内容,如果相同,返回true
    =,!=,< , <=,>, >= 保持其原有意思,比较字符串是否相等,是否大于....注意小写字母大于大写字母

①判断为空
      一种使用s.size和0进行比较,一种使用s.empty()来进行判断
②字符串拼接
         当进行string对象和字符串字面值混合连接时,+操作符的左右操作数至少有一个是string类型的。(连接方向从左至右)
string s1 = "Hello";  string s2 = "world" ;
string s3 = s1 + ", " + "world" ; // 正确
string s4 = "Hello" + ", " + s2 ; // 错误
③string::size_type
     成员函数size()返回的值不是int型的,而是size_type()类型的;任何存储string的size操作结果的变量必须是string::size_type类型的,特别重要的是,不要将size的返回值赋给整型类型。string::size_type类型在不同的机器上长度是不同的,并非是固定的,但是只要你使用了这个类型,就使你的程序适合这个机器,与实际机器匹配。但是使用int类型的时候,如果你的string:size_type长度刚好和int类型匹配,那么结果正确,但是如果二者不相同(比如换平台了),那么结果就完全不一样了。
string s1 = "hello world";
for(string::size_type i=0;i<=(s1.size()-1);i++){
cout<<s1[i]<<endl;

string对象下标是从0开始的,若为空则不含s[0]。任何可产生整型值的表达式都可以作为下标操作符[]的索引。(不过string对象的索引最好也是string
:: size_type类型,如上)

4.String对象中单字符的处理

    先包含头文件cctype,常用的函数如下: 
函数名称 返回值
isalnum() 如果参数是字母数字,即字母或数字,该函数返回true
isalpha() 如果参数是字母,该函数返回真
isblank() 如果参数是空格或水平制表符,该函数返回true
iscntrl() 如果参数是控制字符,该函数返回true
isdigit() 如果参数是数字(0~9),该函数返回true
isgraph() 如果参数是除空格之外的打印字符,该函数返回true
islower() 如果参数是小写字母,该函数返回true
isprint() 如果参数是打印字符(包括空格),该函数返回true
ispunct() 如果参数是标点符号,该函数返回true
isspace()

如果参数是标准空白字符,如空格、进纸、换行符、回车

、水平制表符或者垂直制表符,该函数返回true

isupper() 如果参数是大写字母,该函数返回true
isxdigit() 如果参数是十六进制的数字,即0~9、a~f、A~F,该函数返回true
tolower() 如果参数是大写字符,则返回其小写,否则返回该参数
toupper() 如果参数是小写字母,则返回其大写,否则返回该参数

5.成员函数c_str(),data(),copy()的用法

①c_str()返回一个const
char*类型的指针,指向以空字符终止的字符数组。不需要手动释放或删除这个指针。数组的数据是临时的,一旦数组的元素被改变,原数据就会失效。因此要么先转换,要么把它的数据复制到用户自己可以管理的内存中。

const char* c;
string s="1234";
c = s.c_str();
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:abcd

c = s.c_str()不是一个好习惯。既然c指针指向的内容容易失效,我们应该用strcpy函数把数据复制出来

char* c=new char[20];
string s="1234";
//c = s.c_str();
strcpy(c,s.c_str());
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:1234

②data():与c_str()类似,但是返回的数组不以空字符终止。

③copy(char*p,n,size_type _Off = 0):从string类型对象中至多复制n个字符到字符指针p指向的空间中。默认从首字符开始,但是也可以指定开始的位置。用户要确保p指向的空间足够保存n个字符。同时这里也对比了另外一种用string类的构造函数的复制方法。具体见实例7.2。

6.常用成员函数

string类的字符操作:

const char &operator[](int n)const;

const char &at(int n)const;

char &operator[](int n);

char &at(int n);

operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。

const char *data()const;//返回一个非null终止的c字符数组

const char *c_str()const;//返回一个以null终止的c字符串

int copy(char *s, int n, int pos = 0)const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目

string的特性描述:

int capacity()const;    //返回当前容量(即string中不必增加内存即可存放的元素个数)

int max_size()const;    //返回string对象中可存放的最大字符串的长度

int size()const;        //返回当前字符串的大小

int length()const;       //返回当前字符串的长度

bool empty()const;        //当前字符串是否为空

void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分

string类的输入输出操作:

string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。

函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符'\n'分开。

string的赋值:

string &operator=(const string&s);//把字符串s赋给当前字符串

string &assign(const char *s);//用c类型字符串s赋值

string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值

string &assign(const string &s);//把字符串s赋给当前字符串

string &assign(int n,char c);//用n个字符c赋值给当前字符串

string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串

string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串

string的连接:

string &operator+=(const string&s);//把字符串s连接到当前字符串的结尾

string &append(const char *s);            //把c类型字符串s连接到当前字符串结尾

string &append(const char *s,int n);//把c类型字符串s的前n个字符连接到当前字符串结尾

string &append(const string&s);    //同operator+=()

string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾

string &append(int n,char c);        //在当前字符串结尾添加n个字符c

string &append(const_iterator first,const_iterator last);//把迭代器first和last之间的部分连接到当前字符串的结尾

string的比较:

bool operator==(const string &s1,conststring &s2)const;//比较两个字符串是否相等

运算符">","<",">=","<=","!="均被重载用于字符串的比较;

int compare(const string &s) const;//比较当前字符串和s的大小

int compare(int pos, int n,const string&s)const;//比较当前字符串从pos开始的n个字符组成的字符串与s的大小

int compare(int pos, int n,const string&s,int pos2,int n2)const;//比较当前字符串从pos开始的n个字符组成的字符串与s中pos2开始的n2个字符组成的字符串的大小

int compare(const char *s) const;

int compare(int pos, int n,const char *s)const;

int compare(int pos, int n,const char *s,int pos2) const;

compare函数在>时返回1,<时返回-1,==时返回0

string的子串:

string substr(int pos = 0,int n = npos)const;//返回pos开始的n个字符组成的字符串

string的交换:

void swap(string &s2);    //交换当前字符串与s2的值

string类的查找函数:

//查找成功时返回所在位置,失败返回string::npos的值

int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置

int find(const char *s, int pos = 0)const;//从pos开始查找字符串s在当前串中的位置

int find(const char *s, int pos, int n)const;//从pos开始查找字符串s中前n个字符在当前串中的位置

int find(const string &s, int pos = 0)const;//从pos开始查找字符串s在当前串中的位置

//从pos开始从后向前查找字符c在当前串中的位置

int rfind(char c, int pos = npos) const;

int rfind(const char *s, int pos = npos)const;

int rfind(const char *s, int pos, int n =npos) const;

int rfind(const string &s,int pos =npos) const;

//从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值

int find_first_of(char c, int pos = 0)const;//从pos开始查找字符c第一次出现的位置

int find_first_of(const char *s, int pos =0) const;

int find_first_of(const char *s, int pos,int n) const;

int find_first_of(const string &s,intpos = 0) const;

//从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。查找失败返回string::npos

int find_first_not_of(char c, int pos = 0)const;

int find_first_not_of(const char *s, intpos = 0) const;

int find_first_not_of(const char *s, intpos,int n) const;

int find_first_not_of(const string&s,int pos = 0) const;

//从当前串中查找第一个不在串s中的字符出现的位置,失败返回string::npos

int find_last_of(char c, int pos = npos)const;

int find_last_of(const char *s, int pos =npos) const;

int find_last_of(const char *s, int pos,int n = npos) const;

int find_last_of(const string &s,intpos = npos) const;

int find_last_not_of(char c, int pos =npos) const;

int find_last_not_of(const char *s, int pos= npos) const;

int find_last_not_of(const char *s, intpos, int n) const;

int find_last_not_of(const string&s,int pos = npos) const;

//find_last_of和find_last_not_of与find_first_of和find_first_not_of相似,只不过是从后向前查找

string类的替换函数:

string &replace(int p0, int n0,constchar *s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,constchar *s, int n);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符

string &replace(int p0, int n0,conststring &s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,conststring &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符

string &replace(int p0, int n0,int n,char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c

string &replace(iterator first0,iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串s

string &replace(iterator first0,iterator last0,const char *s, int n);//把[first0,last0)之间的部分替换为s的前n个字符

string &replace(iterator first0,iterator last0,const string &s);//把[first0,last0)之间的部分替换为串s

string &replace(iterator first0,iterator last0,int n, char c);//把[first0,last0)之间的部分替换为n个字符c

string &replace(iterator first0,iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之间的部分替换成[first,last)之间的字符串

string类的插入函数:

string &insert(int p0, const char *s);

string &insert(int p0, const char *s,int n);

string &insert(int p0,const string&s);

string &insert(int p0,const string&s, int pos, int n);

//前4个函数在p0位置插入字符串s中pos开始的前n个字符

string &insert(int p0, int n, charc);//此函数在p0处插入n个字符c

iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置

void insert(iterator it, const_iteratorfirst, const_iterator last);//在it处插入[first,last)之间的字符

void insert(iterator it, int n, char c);//在it处插入n个字符c

string类的删除函数

iterator erase(iterator first, iteratorlast);//删除[first,last)之间的所有字符,返回删除后迭代器的位置

iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置

string &erase(int pos = 0, int n =npos);//删除pos开始的n个字符,返回修改后的字符串

string类的迭代器处理:

string类提供了向前和向后遍历的迭代器iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。

用string::iterator或string::const_iterator声明迭代器变量,const_iterator不允许改变迭代的内容。常用迭代器函数有:

const_iterator begin()const;

iterator begin();                //返回string的起始位置

const_iterator end()const;

iterator end();                    //返回string的最后一个字符后面的位置

const_iterator rbegin()const;

iterator rbegin();                //返回string的最后一个字符的位置

const_iterator rend()const;

iterator rend();                    //返回string第一个字符位置的前面

rbegin和rend用于从后向前的迭代访问,通过设置迭代器string::reverse_iterator,string::const_reverse_iterator实现



7.综合实例


7.1去除字符串中的标点
#include <iostream>
#include<string>
#include<cctype>
using namespace std;
using std::string;
int main()
{
string s,res;
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;
}

7.2字符串的赋值之copy()
#include"stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int main( )
{
string str1 ( "1234567890" );
basic_string <char>::iterator str_Iter;
char array1 [20] = {0};
char array2 [10] = {0};
basic_string <char>:: pointer array1Ptr = array1;
basic_string <char>:: value_type *array2Ptr = array2; cout << "The original string str1 is: ";
for ( str_Iter = str1.begin( ); str_Iter != str1.end( ); str_Iter++ )
cout << *str_Iter;
cout << endl; basic_string <char>:: size_type nArray1;
nArray1 = str1.copy ( array1Ptr , 12 ); //至多复制12个字符,默认从0开始
cout << "The number of copied characters in array1 is: " << nArray1<< endl;
cout << "The copied characters array1 is: " << array1Ptr << endl; basic_string <char>:: size_type nArray2;
nArray2 = str1.copy ( array2Ptr , 5 , 6 );//从索引6开始,至多复制5个字符
cout << "The number of copied characters in array2 is: " << nArray2 << endl;
cout << "The copied characters array2 is: " << array2Ptr << endl; string str2(str1,2,3);//还可以使用的一种复制方法,从索引2开始复制3个字符
return 0;
}

       string转化为char*: 常用的为data,c_str()都可以转换为const char*。至于要转换为char*,第一可以使用const_cast<char*>强制转换,第二可以使用如上的copy函数。
7.3  查找与替换
#include <iostream>
#include <string>
#include <cstddef> int main ()
{
std::string str ("The sixth sick sheik's sixth sheep's sick.");
std::string key ("sixth"); std::size_t found = str.rfind(key);
if (found!=std::string::npos)
str.replace (found,key.length(),"seventh"); std::cout << str << '\n'; return 0;
}



Note: string::copy is potentially unsafe, consider. using string::_Copy_s instead.










参考

C++之string类的更多相关文章

  1. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  2. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  3. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  4. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  5. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

  6. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  7. 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明

    Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...

  8. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  9. String类常用方法

    1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...

  10. 运用String类实现一个模拟用户登录程序

    package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...

随机推荐

  1. GIT笔记:GITHUB教程【官方自译版】

    GIT笔记:将项目发布到GITHUB GITHUB是什么 GitHub是版本控制和协作的代码托管平台.它可以让你和其他人在任何地方一起工作. 1.创建一个新的仓库 存储库通常用于组织单个项目.存储库可 ...

  2. mysql主从复制(linux下)

    转至:http://369369.blog.51cto.com/319630/790921 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:   1. ...

  3. pandas.resample()

    http://www.cnblogs.com/hhh5460/p/5596340.html resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数 ...

  4. RedisTemplate操作Redis

    RedisTemplate Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序 ...

  5. Linux离线同步时间

    Linux离线同步时间 思路:以其中一台时间为准 脚本 #!/bin/shcurrent=`date '+%H:%M:%S'` for i in bigdata1 bigdata2 bigdata3 ...

  6. 第二天(1)声明式验证之使用验证框架验证域模型和ModelDriven验证

    有一类特殊的属性,即这个属性的类型是另外一个JavaBean,如有一个User类,代码如下: package data; public class User { private String name ...

  7. 记录quick cocos2d-x3.2升级至cocos2d-x3.8

    目前为止,quickcocos2d-x没有3.8版本,想用3.8又想用quick,所以只能自己升级了,自己先记录下,防止忘记. cocos2d-x3.8里面有quick framework,而simu ...

  8. Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】

    题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...

  9. CommonJS、AMD与CMD

    自从有了模块,我们可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套! 于是下面三个模块 ...

  10. CentOS安装wireshark

    yum install wireshark-gnome yum install libpcap