主要最近要用的上 才整理一下
用string类别忘了导入头文件
#
注意这个细节:cout 可直接输出 string 类的对象的内容 但是printf不可以 需要转化成char指针
#include <string> #include <iostream> #include <stdio.h> using namespace std; int main() { string strOutput = "Hello World"; cout << "[cout] strOutput is: " << strOutput << endl; // string 转换为 char* const char* pszOutput = strOutput.c_str(); printf("[printf] strOutput is: %s ", pszOutput); return 0; }
string s1; 默认构造函数,s1为空串
string s2(s1); 将s2初始化为s1的一个副本
string s3("value"); 将s3初始化为一个字符串字面值副本
string s4(n,'c') 将s4初始化为字符'c'的n个副本
对于对象的操作
s.empty()如果s为空串,则返回true,否则返回false
s.size()返回s 中字符的字符个数
s[n]
返回s中位置为n的字符,位置从0开始计数
s1+s2把s1和s2链接成一个新的字符串,返回新生成的字符串
s1=s2把s1内容替换为s2的副本
v1==v2判断v1与v2的内容,相等则返回true,否则返回false
!=, <, <=, >, >=保持这些操作的惯有含义
s.size()返回的类型是string::size_type()类型,而不是int形,string::size_type 的类型长度是int的俩倍所以尽量让s.size()的返 回值给string::size_type 类型
#include<iostream> #include<string> #include<cstdio> using namespace std; int main() { string s("value"); string::size_type it; it=s.size(); cout<<it<<endl;//5 return 0; }
注意:除了一些特殊操作,string类型提供与vector容器相同的操作。string类型和vector容器不同的是,它不支持以栈方式操纵容器:在string类型中不能使用front,back,pop_back操作
string 是支持push_back()的,因为string也是顺序容器
String的遍历
1 #include<iostream> 2 #include<string> 3 #include<cstdio> 4 5 using namespace std; 6 int main() 7 { 8 string s("Helloworld"); 9 string::iterator it; 10 for(it=s.begin();it!=s.end();++it) 11 cout<<*it<<endl; 12 for(int i=0;s[i];i++) 13 cout<<s[i]<<endl; 14 cout<<s<<endl; 15 return 0; 16 }
下面举几个例子:
#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 world
world
wor
abcde
abc
AAAAA
Hello
#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!
对于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填充不足的部分
#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
string的查找比较丰富:
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
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,最好的办法是直接比较。
#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; }
运行结果:
其他常用函数
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*
#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 ",p); return 0; }
程序执行结果为:
abc123defg
abcdefg
123abcdefg
123abcdefg123
123abcdefg123A
helloabcdefg123A
abcdefg
swap!
swap!