C++之string类
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对象中单字符的处理
函数名称 | 返回值 |
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.综合实例
#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;
}
#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;
}
#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;
}
C++之string类的更多相关文章
- 标准库String类
下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...
- 自己实现简单的string类
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...
- C++ string类的实现
c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ...
- String类的功能
String类 标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...
- java基础复习:final,static,以及String类
2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...
- String类和StringBuffer类的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明
Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- String类常用方法
1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...
- 运用String类实现一个模拟用户登录程序
package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...
随机推荐
- GIT笔记:GITHUB教程【官方自译版】
GIT笔记:将项目发布到GITHUB GITHUB是什么 GitHub是版本控制和协作的代码托管平台.它可以让你和其他人在任何地方一起工作. 1.创建一个新的仓库 存储库通常用于组织单个项目.存储库可 ...
- mysql主从复制(linux下)
转至:http://369369.blog.51cto.com/319630/790921 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1. ...
- pandas.resample()
http://www.cnblogs.com/hhh5460/p/5596340.html resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数 ...
- RedisTemplate操作Redis
RedisTemplate Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序 ...
- Linux离线同步时间
Linux离线同步时间 思路:以其中一台时间为准 脚本 #!/bin/shcurrent=`date '+%H:%M:%S'` for i in bigdata1 bigdata2 bigdata3 ...
- 第二天(1)声明式验证之使用验证框架验证域模型和ModelDriven验证
有一类特殊的属性,即这个属性的类型是另外一个JavaBean,如有一个User类,代码如下: package data; public class User { private String name ...
- 记录quick cocos2d-x3.2升级至cocos2d-x3.8
目前为止,quickcocos2d-x没有3.8版本,想用3.8又想用quick,所以只能自己升级了,自己先记录下,防止忘记. cocos2d-x3.8里面有quick framework,而simu ...
- Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】
题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...
- CommonJS、AMD与CMD
自从有了模块,我们可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套! 于是下面三个模块 ...
- CentOS安装wireshark
yum install wireshark-gnome yum install libpcap