首先,为了在程序中使用string类型,必须包含头文件 <string>。以下:html
#include <string>
注意这里不是string.h,string.h是C字符串头文件。ios
string类是一个模板类,位于名字空间std中,一般为方便使用还须要增长:web
using namespace std;
声明一个字符串变量很简单:数组
string str;
测试代码:app
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <iostream>
#include <string>
using
namespace
std;
int
main ( )
{
string str;
//定义了一个空字符串str
str =
"Hello world"
;
// 给str赋值为"Hello world"
char
cstr[] =
"abcde"
;
//定义了一个C字符串
string s1(str);
//调用复制构造函数生成s1,s1为str的复制品
cout<<s1<<endl;
string s2(str,6);
//将str内,开始于位置6的部分看成s2的初值
cout<<s2<<endl;
string s3(str,6,3);
//将str内,开始于6且长度顶多为3的部分做为s3的初值
cout<<s3<<endl;
string s4(cstr);
//将C字符串做为s4的初值
cout<<s4<<endl;
string s5(cstr,3);
//将C字符串前3个字符做为字符串s5的初值。
cout<<s5<<endl;
string s6(5,
'A'
);
//生成一个字符串,包含5个'A'字符
cout<<s6<<endl;
string s7(str.begin(),str.begin()+5);
//区间str.begin()和str.begin()+5内的字符做为初值
cout<<s7<<endl;
return
0;
}
|
程序执行结果为:函数
Hello worldpost
world测试
worspa
abcde.net
abc
AAAAA
Hello
2、string的比较等操做
你能够用 ==、>、<、>=、<=、和!=比较字符串,能够用+或者+=操做符链接两个字符串,而且能够用[]获取特定的字符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
#include <string>
using
namespace
std;
int
main()
{
string str;
cout <<
"Please input your name:"
<<endl;
cin >> str;
if
( str ==
"Li"
)
// 字符串相等比较
cout <<
"you are Li!"
<<endl;
else
if
( str !=
"Wang"
)
// 字符串不等比较
cout <<
"you are not Wang!"
<<endl;
else
if
( str <
"Li"
)
// 字符串小于比较,>、>=、<=相似
cout <<
"your name should be ahead of Li"
<<endl;
else
cout <<
"your name should be after of Li"
<<endl;
str +=
", Welcome!"
;
// 字符串+=
cout << str<<endl;
for
(
int
i = 0 ; i < str.size(); i ++)
cout<<str[i];
// 相似数组,经过[]获取特定的字符
return
0;
}
|
程序执行结果为:
Please input your name:
Zhang↙
you are not Wang!
Zhang, Welcome!
Zhang, Welcome!
上例中,“ cout<< str[i]; ”可换为: cout<< str.at(i);
3、string特性描述
可用下列函数来得到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填充不足的部分
测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
#include <string>
using
namespace
std;
int
main()
{
string str;
if
(str.empty())
cout<<
"str is NULL."
<<endl;
else
cout<<
"str is not NULL."
<<endl;
str = str +
"abcdefg"
;
cout<<
"str is "
<<str<<endl;
cout<<
"str's size is "
<<str.size()<<endl;
cout<<
"str's capacity is "
<<str.capacity()<<endl;
cout<<
"str's max size is "
<<str.max_size()<<endl;
cout<<
"str's length is "
<<str.length()<<endl;
str.resize(20,
'c'
);
cout<<
"str is "
<<str<<endl;
str.resize(5);
cout<<
"str is "
<<str<<endl;
return
0;
}
|
程序执行结果为:
str is NULL.
str is abcdefg
str's size is 7
str's capacity is 15
str's max size is 4294967294
str's length is 7
str is abcdefgccc
str is abcde
4、string的查找
因为查找是使用最为频繁的功能之一,string提供了很是丰富的查找函数:(注:string::npos)
size_type find( const basic_string &str, size_type index ); //返回str在字符串中第一次出现的位置(从index开始查找),若是没找到则返回string::npos
size_type find( const char *str, size_type index ); // 同上
size_type find( const char *str, size_type index, size_type length ); //返回str在字符串中第一次出现的位置(从index开始查找,长度为length),若是没找到就返回string::npos
size_type find( char ch, size_type index ); // 返回字符ch在字符串中第一次出现的位置(从index开始查找),若是没找到就返回string::npos
注意:查找字符串a是否包含子串b,不是用 strA.find(strB) > 0 而是 strA.find(strB) != string:npos 这是为何呢?(初学者比较容易犯的一个错误)本部分参考自web100与luhao1993
先看下面的代码
int idx = str.find("abc"); if (idx == string::npos);
上述代码中,idx的类型被定义为int,这是错误的,即便定义为 unsigned int 也是错的,它必须定义为 string::size_type。npos 是这样定义的: static const size_type npos = -1; 由于 string::size_type (由字符串配置器 allocator 定义) 描述的是 size,故需为无符号整数型别。由于缺省配置器以型别 size_t 做为 size_type,因而 -1 被转换为无符号整数型别,npos 也就成了该型别的最大无符号值。不过实际数值仍是取决于型别 size_type 的实际定义。不幸的是这些最大值都不相同。事实上,(unsigned long)-1 和 (unsigned short)-1 不一样(前提是二者型别大小不一样)。所以,比较式 idx == string::npos 中,若是 idx 的值为-1,因为 idx 和字符串string::npos 型别不一样,比较结果可能获得 false。所以要想判断 find()等查找函数的结果是否为npos,最好的办法是直接比较。
测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include<iostream>
#include<string>
using
namespace
std;
int
main(){
int
loc;
string s=
"study hard and make progress everyday! every day!!"
;
loc=s.rfind(
"make"
,10);
cout<<
"the word make is at index"
<<loc<<endl;
//-1表示没找到
loc=s.rfind(
"make"
);
//缺省状态下,从最后一个往前找
cout<<
"the word make is at index"
<<loc<<endl;
loc=s.find_first_of(
"day"
);
cout<<
"the word day(first) is at index "
<<loc<<endl;
loc=s.find_first_not_of(
"study"
);
cout<<
"the first word not of study is at index"
<<loc<<endl;
loc=s.find_last_of(
"day"
);
cout<<
"the last word of day is at index"
<<loc<<endl;
loc=s.find(
"day"
);
//缺陷状态下从第一个日后找
cout<<loc;
return
0;
}
|
运行结果:
5、其余经常使用函数
string &insert(int p,const string &s); //在p位置插入字符串s
string &replace(int p, int n,const char *s); //删除从p开始的n个字符,而后在p处插入串s
string &erase(int p, int n); //删除p开始的n个字符,返回修改后的字符串
string substr(int pos = 0,int n = npos) const; //返回pos开始的n个字符组成的字符串
void swap(string &s2); //交换当前字符串与s2的值
string &append(const char *s); //把字符串s链接到当前字符串结尾
void push_back(char c) //当前字符串尾部加一个字符c
const char *data()const; //返回一个非null终止的c字符数组,data():与c_str()相似,用于string转const char*其中它返回的数组是不以空字符终止,
const char *c_str()const; //返回一个以null终止的c字符串,即c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,用于string转const char*
测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <iostream>
#include <string>
using
namespace
std;
int
main()
{
string str1 =
"abc123defg"
;
string str2 =
"swap!"
;
cout<<str1<<endl;
cout<<str1.erase(3,3)<<endl;
//从索引3开始的3个字符,即删除掉了"123"
cout<<str1.insert(0,
"123"
)<<endl;
//在头部插入
cout<<str1.append(
"123"
)<<endl;
//append()方法能够添加字符串
str1.push_back(
'A'
);
//push_back()方法只能添加一个字符
cout<<str1<<endl;
cout<<str1.replace(0,3,
"hello"
)<<endl;
//即将索引0开始的3个字符替换成"hello"
cout<<str1.substr(5,7)<<endl;
//从索引5开始7个字节
str1.swap(str2);
cout<<str1<<endl;
const
char
* p = str.c_str();
printf
(
"%s\n"
,p);
return
0;
}
|
程序执行结果为:
abc123defg
abcdefg
123abcdefg
123abcdefg123
123abcdefg123A
helloabcdefg123A
abcdefg
swap!
swap!