头文件: #include <string>
一、string对象的定义:
string s1; //构造字符串s1
string s2(s1); //把字符串s1值赋给字符串s2
string s1("wuyang"); //构造字符串s1,且s1为wuyang
string s1(n,'w'); //构造字符串s1,且s1为n个w
cin >> s1; //输入字符串s1,但是不读入空格和换行
getline(cin,s1); //输入字符串s1,读入空格但是不读入换行
getline(cin,s1,'w'); //输入字符串s1,读入空格和换行,直到遇到w
二、string的一些操作
s1.empty(); //判断s1为是否为空 为空返回真,否则返回假
s1.size(); //求字符串s1的长度
//注意:s1.size()返回的值并不是int类型
s1.length(); //求字符串s1长度
s1[n]; //代表字符串s1中第n+1位的字符
s1.append("abc"); //在字符串尾部添加字符串
s1+s2; //将s2连接到s1后面(连接了s1,s2)
//注意:s1+'w'+'y'这种相加是允许的。但是'w'+'y'+s1是错误的
s1=s2; //把s2的值赋给s1
s1==s2; //判断s1,s2是否相等,相等为真
来展示一段代码帮助理解:
int main()
{
string s1("123");
cout << "字符串s1初始值为: " << s1 << endl;
string s2("456");
s1.append("abc");
cout << "字符串s1为: " << s1 << endl;
cout << "s1+s2结果为" << s1+s2 << endl ;
while(!s1.empty())
{
string::size_type i; //这里i要定义成size_type类型
for(i=0; i!=s1.size();i++) //s1.size()表示s1的字符长度
{
cout<<s1[i];
}
cout<<endl;
break;
}
return 0;
}
三、对string中字符的处理:
isalnum(c); //字符c如果是字母或数字,返回真
isdigit(c); //字符c如果是数字,返回真
isxdigit(c);//字符c是十六进制数,返回真
isalpha(c); //字符c如果是字母,返回真
islower(c); //字符c如果是小写字母,返回真
isupper(c); //字符c如果是大写字母,返回真
tolower(c); //字符c是大写字母,返回其小写,否则返回c
toupper(c); //字符c是小写字母,返回其大写,否则返回c
isgraph(c); //字符c是可打印字符(不可是空格),返回真
isprint(c); //字符c是可打印字符(可以是空格),返回真
iscntrl(c); //字符c是控制符,返回真
ispunct(c); //字符c是标点符,返回真
isspace(c); //字符c是空格符,返回真
下面展示一段代码
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string s1("123abc. >@");
cout << "字符串s1为: " << s1 << endl << endl;
string::size_type i;
for(i=0;i<s1.size();i++)
{
if(isgraph(s1[i]))
cout << s1[i] << " ";
if(isdigit(s1[i]))
cout << "数字 " << endl;
if(isalpha(s1[i]))
{
cout << "字母" ;
if(islower(s1[i]))
cout << "(小写字母)" << endl;
if(isupper(s1[i]))
cout << "(大写字母) " << endl;
}
if(ispunct(s1[i]))
cout << "标点符 " << endl;
if(isspace(s1[i]))
cout << " 空格符" << endl;
}
return 0;
}
四、string与数值的相互转换
头文件: #include <sstream>
C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。
istringstream //用于执行C++风格的串流的输入操作。
ostringstream //用于执行C风格的串流的输出操作。
stringstream //同时可以支持C风格的串流的输入输出操作。
代码:
方法一 这是C的方法 用到了sprintf
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
char b[10];
string a;
sprintf(b,"%d",1975); //数值转化为string
a=b;
cout<<a;
}
方法二 用到#include <sstream>
// 数字转换成字符
#include <iostream>
#include <string>
#include <cstdio>
#include <sstream>
using namespace std;
int main()
{
double x;
x=1975;
ostringstream o;
o<<x;
cout << o.str();
return 0;
}
//字符转换成数字
#include <iostream>
#include <string>
#include <cstdio>
#include <sstream>
using namespace std;
int main()
{
string s1("7569");
double x;
x=1975;
istringstream o(s1);
o>>x;
cout << x;
return 0;
}
五、字符的插入,删除,替换,查找
首先要作如下操作
string s1="abc123def";
string::iterator it; //定义迭代器
1.插入
it=s1.begin(); //表示迭代器的位置(这里是s1的第一个元素)
s1.insert(it+1,'s'); //迭代器所在位置后一位上的元素前插入‘s’
cout << s1 << endl;
2.删除
it=s1.begin(); //表示迭代器的位置(这里是s1的第一个元素)
s1.erase(it+1); //表示删除迭代器位置后一位上的元素
//s1.erase(it,it+1); //表示删除it到it+1间的元素
cout << s1 << endl;
3.替换s1.replace(pos,num,char* a);
pos 代表下标,num代表元素个数,char* a代表要替换成的元素
string s1="abc1234..<<@@";
s1.replace(3,4,"good"); //从下标3开始连续四个元素替换为good
cout<<s1<<endl;
来变一段代码帮助理解以上三个操作
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
string s1="abc1234..<<@@";
s1.replace(pos,num,char* c);
string::iterator it; //定义一迭代器
s1.replace(3,4,"good"); //从下标3开始连续四个元素替换为good
cout<<s1<<endl;
it=s1.begin(); //表示迭代器的位置(这里是s1的第一个元素)
s1.insert(it+1,'p'); //迭代器所在位置后一位上的元素前插入‘s’
cout << s1 << endl;
it=s1.begin(); //表示迭代器的位置(这里是s1的第一个元素)
s1.erase(it+1); //表示删除迭代器所在位置后一位上的元素
cout << s1 << endl;
return 0;
}
查找
s1.find('c'); //返回第一个'c'的下标
s1.find("abc"); //返回第一个"abc"的下标
s1.find('c',pos); //从下标pos开始返回第一个'c'的下标
s1.find("abc",pos); //从下标pos开始返回第一个'abc'的下标
s1.rfind('c'); //从后往前第一个'c'的下标
s1.rfind("abc"); //从后往前第一个"abc"的下标
s1.rfind('c',pos); //从下标pos开始从后往前第一个'c'的下标
s1.rfind("abc",pos);//从下标pos开始从后往前第一个"abc"的下标
s1.find("abc",pos,n);
//从下标pos开始,返回子串中前n个子串在s1中的位置
s1.rfind("abc",pos,n);
//从下标pos开始,从前往后查找,返回子串中前n个子串在s1中的位置
编写一段代码
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
string s1="123abc1234..<<@@abc12abc123abc123abc123abc";
int pos,n;
cout << "第一个c的下标是:" << s1.find('c') << endl;
cout << "第一个abc的下标是: " << s1.find("abc") << endl;
cout << "从后往前第一个c的下标是:" << s1.rfind('c') << endl;
cout << "从后往前第一个abc的下标是: " << s1.rfind("abc") << endl;
cin >> pos ;
cout << "从下标pos开始第一个'c'的下标是: " << s1.find('c',pos) << endl;
cout << "从下标pos开始第一个abc的下标是: " << s1.find("abc",pos) << endl;
cout << "从下标pos开始从后往前第一个c的下标是: " << s1.rfind('c',pos) <<endl;
cout << "从下标pos开始从后往前第一个abc的下标是: " << s1.rfind("abc",pos) << endl;
cin >> n;
cout << "从下标pos开始,子串中前n个子串在s1中的位置是: " <<s1.find("abc",pos,n) << endl;
cout << "从下标pos开始,从后往前查找,子串中前n个子串在s1中的位置是: " <<s1.rfind("abc",pos,n) << endl;
return 0;
}