C字符串和string类互转
#include <iostream> #include <string> int main(void) { //C字符串 转 string类 const char *s1 = "hello"; std::string s2 = std::string(s1); std::cout<<s2<<std::endl; //string类 转 C字符串 std::string s3 = "world"; char *s4 = (char*) s3.data(); //或 .c_str(),C++11后两者完全等价 std::cout<<s4<<std::endl; return 0; }
string、string.h、cstring、CString的区别与联系
⑴ string是C++标准库里面的string模板,也包含了C风格字符串操作的库函数,因此可以定义string类,使用时需声明namespace std。
⑵ string.h是C风格字符串操作的一个库函数,因此使用#include <string.h>时是不能定义string类的,使用时不需声明namespace std。
⑶ cstring是把string.h放到std中,它的功能和string.h一样,因为使用了std,所以使用时需要声明namespace std。
⑷ CString属于MFC的类,Visual C++中最常用的字符串类,继承自CSimpleStringT类,所以使用CString时要包含afx.h头文件。
string类和C字符串的简单对比
声明字串 string s; char s[100]; 字串长度 s.length() 或 s.size() strlen(s) 首尾字符 s.front() 和 s.back() 或 s[0] 和 s[s.size()-1] s[0] 和 s[strlen(s)-1] 字符引用 s[i] 或 s.at(i) s[i] 读取一行 getline(cin, s); gets(s); 字串赋值 s="ABCD"; strcpy(s, "ABCD"); 字串连接 s=s+"ABCD"; 或 s+="ABCD"; strcat(s, "ABCD"); 字串比较 s=="ABCD"; strcmp(s, "ABCD");
string类与C字符串对比,感觉前者操作比较直观, 另外还不用自己管理内存,长度几乎没有限制并且可以任意加长缩短。
字符串的最大长度
字符串char s[],char*s 的长度受限于操作系统给应用程序分派的栈内存、堆内存的大小。关于C++内存分配详见文末转载的附录。
string类字符串占用内存是动态的,它的上限可以通过string::max_size()函数获得。32位系统约4G字节,64位系统约4E字节(1E = 1KP = 1MT = 1GG = 2^60);甚至有些超大型服务器上是16E字节。不过实际上使用时最大长度也受限于计算机内存容量的,在内存可以承受的范围内,可以简单地认为string支持的字符串大小没有上限,或者上限大到几乎用不到。
#include <iostream> #include <string> using namespace std; int main(void) { string str; cout<<str.max_size()<<endl; //4611686018427387897<--64位系统 ≈4G个1G字节 cout<<unsigned(-1)<<endl; //4294967295<--32位系统通常会等于这个值,=4G-1字节 return 0; }
提示: 打开网址 cpp.sh/8krms,点RUN查看运行结果。
cstring库函数和string类成员函数对比
strlen、strnlen
功能:串长度,从字符串的首字符起到第一个 '\0' 前的字符止的字符个数;如果仅声明没赋初值,结果是不定的,计数到 '\0' (不含)才会停止。
用法:size_t strlen(const char *s);
size_t strlen(const char *s, size_t n);
#include <iostream> #include <cstring> using namespace std; int main(void) { size_t size=0; const char* str="Hello,world!"; size=strlen(str); cout<<"Size of the string is "<<size<<endl; size_t n; n=5; size=strnlen(str,n); cout<<"Size of the string is "<<size<<endl; n=20; size=strnlen(str,n); cout<<"Size of the string is "<<size<<endl; //strnlen 计数到n或遇到'\0'止 //返回值:size=(n>=strlen(str))?strlen(str):n return 0; }
提示: 打开网址 cpp.sh/6b6hj,点RUN查看运行结果。
string::size、string::length 串长
#include <iostream> #include <string> using namespace std; int main () { string str="Hello,world!"; cout<<str.size()<<endl; cout<<str.length()<<endl; //size() length() 两者完全等价 return 0; }
提示: 打开网址 cpp.sh/3nm3z,点RUN查看运行结果。
strcpy、strncpy
功能:串复制,将源字符串src全部、或最多n个字符复制到目标字符数组dest中,返回指向dest的指针。
用法:char *strcpy(char *dest, char *source);
char *strncpy(char *dest, char *src, size_t n);
#include <iostream> #include <cstring> using namespace std; int main(void) { const char *str1="123456789"; char deststring[20]; //目标字符串数组长度得足够容纳源字符串 strcpy(deststring,str1); //全部复制 cout<<deststring<<endl; //结果为 123456789 const char *str2="hello,world!"; strncpy(deststring,str2,5); //部分复制5个字符,注意没得到'\0' cout<<deststring<<endl; //结果为 hello6789 cout<<strlen(deststring)<<endl; deststring[5]='\0'; //设置字符串结束标志 cout<<deststring<<endl; //结果为 hello cout<<strlen(deststring)<<endl; return 0; }
提示: 打开网址 cpp.sh/5yiqo,点RUN查看运行结果。
string::string、string::assign(string::operator=) 构造与赋值
#include <iostream> #include <string> #include <array> #include <vector> using namespace std; int main () { string dest,dest2; string src="Hello,world!"; dest.assign(src); //对比strcpy cout<<dest<<endl; dest2=src; //或直接用=赋值 cout<<dest2<<endl; int n=5; dest=string(src.begin(),src.begin()+n); //对比strncpy cout<<dest<<endl; char buf[20]="Hello,world!"; dest=string(buf,buf+n); //从字符数组取值 cout<<dest<<endl; n=2; array<char,5>arr={'H','e','l','l','o'}; dest=string(arr.begin(),arr.begin()+n); //从array模板类取值 cout<<dest<<endl; vector<char>vct={'H','e','l','l','o'}; dest=string(vct.begin(),vct.begin()+n); //从vector容器取值 cout<<dest<<endl; //string类的本质和字符型vector或字符array类比较类同 return 0; }
提示: 打开网址 cpp.sh/6klz7,点RUN查看运行结果。
strset、strnset
功能:置字符,将字符串str中全部或部分前n个字符设置为字符c,返回指向dest的指针。
用法:char *strcat(char *str, char c);
char *strncat(char *str, char c, size_t n);
#include <iostream> #include <cstring> using namespace std; int main(void) { char str[]="Hello,world!"; char c='*'; char *p; p=strnset(str,c,5); cout<<p<<endl; //显示:*****,world! cout<<str<<endl; //显示:*****,world! p=strset(str,c); cout<<p<<endl; //显示:************ cout<<str<<endl; //显示:************ return 0; }
提示: 某些编译器已废止弃用这两个函数。
string::replace+string::string or string::assign+string::substr
无对应函数,可以用多种函数组合的方法实现类似功能。
#include <iostream> #include <string> using namespace std; int main(void) { char c='*'; string str="Hello,world!"; str=str.replace(0,5,string(5,c)); cout<<str<<endl; str="Hello,world!"; str=str.replace(str.begin(),str.begin()+5,string(5,c)); cout<<str<<endl; //也能用其他函数组合实现: str="Hello,world!"; str=str.assign(5,c)+str.substr(5,str.size()); cout<<str<<endl; str="Hello,world!"; str=string(5,c)+str.substr(5,str.size()); cout<<str<<endl; return 0; }
提示: 打开网址 cpp.sh/3ez23,点RUN查看运行结果。
strcat、strncat
功能:串连接,把源串src的全部或前n个字符接到目标串dest尾,返回指向dest的指针。
用法:char *strcat(char *dest, char *src);
char *strncat(char *dest, char *src, size_t n);
#include <iostream> #include <cstring> using namespace std; int main(void) { char dest[8]; const char *Dev="Dev-",*CPP="C++"; char *str; strcpy(dest,Dev); cout<<dest<<endl; str=strcat(dest,CPP); cout<<dest<<endl; cout<<str<<endl; return 0; }
提示: 打开网址 cpp.sh/2mddy,点RUN查看运行结果。
std::operator+ 字符串连接
#include <iostream> #include <string> using namespace std; int main(void) { string cpp,hello="Hello,",Dev="Dev-",c="C++"; cpp=hello+Dev+c; //直接用加号连接 cout<<cpp<<endl; int n=5; Dev+=c; //还能用 += cpp=hello+string(Dev.begin(),Dev.begin()+n); //对比 strncat() cout<<cpp<<endl; return 0; }
提示: 打开网址 cpp.sh/7oumk,点RUN查看运行结果。
strcmp、strncmp
功能:串比较,从索引0位置开始比Ascii码,若str1>str2,返回值 > 0;反之 < 0;两串相等,返回0。
用法:int strcmp(char *str1, char *str2);
int strncmp(char *str1, char *str2, size_t n);
#include <iostream> #include <cstring> using namespace std; int main(void) { const char *buf1="aaa", *buf2="bbb", *buf3="ccc"; int ptr; ptr=strcmp(buf2,buf1); if(ptr>0) cout<<"buf2 is greater than buf1"<<endl; else cout<<"buf2 is less than buf1"<<endl; ptr=strcmp(buf2,buf3); if(ptr>0) cout<<"buf2 is greater than buf3"<<endl; else cout<<"buf2 is less than buf3"<<endl; return 0; }
提示: 打开网址 cpp.sh/37okg,点RUN查看运行结果。
string::compare、std::operator== (>、<、>=、<=) 字符串比较
#include <iostream> #include <string> using namespace std; int main(void) { string str1="abc"; string str2="aba"; string str3="abc"; cout << str1.compare(str2) <<endl; //1 cout << str1.compare(str3) <<endl; //0 cout << (str1==str2) <<endl; //0 cout << (str1>str2) <<endl; //1 cout << (str1<str2) <<endl; //0 cout << (str1>=str2) <<endl; //1 cout << (str1<=str2) <<endl<<endl; //0 cout << (str1==str3) <<endl; //1 cout << (str1>str3) <<endl; //0 cout << (str1<str3) <<endl; //0 cout << (str1>=str3) <<endl; //1 cout << (str1<=str3) <<endl; //1 return 0; }
提示: 打开网址 cpp.sh/62ifh,点RUN查看运行结果。compare()在网页版上的返回值稍有不同。
strlwr、strupr
功能:串大小写,字符串的字母转化为小写字母或大写字母,字母之外的标点和数字不变。
用法:char *strlor(char *str); //字串中的字母都 tolower(c)
char *strupr(char *str); //字串中的字母都 toupper(c)
#include <iostream> #include <cstring> using namespace std; int main(void) { char buf[]="Dev-C++ 5.11"; cout<<strlwr(buf)<<endl; //显示:dev-c++ 5.11 cout<<strupr(buf)<<endl; //显示:DEV-C++ 5.11 return 0; }
提示: 某些编译器已废止弃用这两个函数。
transform(s.begin(), s.end(), s.begin(), ::tolower); 、::toupper
无对应函数,用transform算法把全串字符逐个转小写或大写。需要#include<algorithm>
#include <iostream> #include <string> #include <algorithm> using namespace std; int main(void) { string t; cout << "请输入字符串:"; cin >> t; transform(t.begin(),t.end(),t.begin(),::tolower); //转小写 cout<<"转换成小写之后:" << t << endl; transform(t.begin(),t.end(),t.begin(),::toupper); //转大写 cout<<"转换成大写之后:" << t << endl; return 0; }
提示: 打开网址 cpp.sh/8zs4o,点RUN查看运行结果。