4.3 C风格的字符串
c++尽管支持c风格的字符串,但不该在c++中使用这个类型。c风格的字符串常常带来许多错误!
#include<cstring>
cstring是string.h头文件的c++版本
c风格的字符串是以空字符null("\0")结束的字符数组。
c风格字符串的的标准库函数:
strlen(s) 返回s的长度,不包括null字符!!注意与sizeof()函数的不同
strcmp(s1,s2) 比较s1与s2是否相同,若相同放回0,若s1>s2f返回正数s1<s2返回负数
strcat(s1,s2) 将字符串s2连接到s1后面
strcpy(s1,s2) 将s2复制给s1
strncat(s1,s2,n) 将s2的前n个字符链接到s1后面,并返回s1
strncpy(s1,s2,n) 将s2的前n个字符复制给s1,并返回s1
注意:参数是const char*类型的
永远不要忘记字符串结束符null
char ca[]={'c','+','+'};
cout<<strlen(ca)<<endl; //ca不是以null结束的,出现错误!!
习题4.25
编程比较string类型的字符串
#include<iostream> #include<string> using namespace std; int main(){ string s1(10,'a'),s2(20,'b'); if(s1>s2) cout<<"s1>s2"<<endl; else if(s1==s2) cout<<"s1=s2"<<endl; else cout<<"s1<s2"<<endl; return 0; }比较两个 c 风格字符串
#include<iostream> #include<cstring> using namespace std; int main(){ const char *cp1="a beautiful flower"; const char *cp2="a tiny lake"; int i=strcmp(cp1,cp2); if(i>0) cout<<"第一个字符串大"<<endl; else if(i<0) cout<<"第二个字符串大 "; else cout<<"同样大"<<endl; return 0; }习题 4.26
从标准输入读入一个string类型的字符串。
#include<iostream> #include<string> using namespace std; int main(){ string s; cin s; cout<<s<<endl; return 0; }从标准输入读入一个 c 风格字符串
#include<iostream> #include<cstring> using namespace std; int main(){ const int str_size=80; char str[str_size]; cin>>str; cout<<str; return 0; }
new表达式,返回新分配数组的第一个元素的指针;
int *pis=new int[10];
初始化动态分配的数组
string *psa=nes string[10];
int *pia=new int[10]; //无初始化
int *pia2=new int[10](); //初始化为默认值0,且只能初始化为默认值零
释放动态数组
delete [ ] pia; //千万不要忘记方括号
习题4.28
#include<iostream> #include<vector> using namespace std; int main(){ vector<int> ivec; int val; cout<<"请输入一些数字"<<endl; cin>>val; while(cin>>val){ ivec.push_back(val); } int *p=new int[ivec.size()]; int *po=p; for(vector<int>::iterator iter=ivec.begin();iter<ivec.end();iter++,po++){ *po=*iter; } delete [] p; return 0; }习题 4.30
#include<iostream> #include<cstring> using namespace std; int main(){ const char * cp1="This is the first string."; const char * cp2="This is the second string."; size_t len=strlen(cp1)+strlen(cp2)+1; char *res=new char[len+1]; strcat(res,cp1); strcat(res,cp2); return 0; }连接两个 string
#include<iostream> #include<string> using namespace std; int main(){ string s1="This is the first.",s2="This is the second.",res; res=s1+'\n'+s2; cout<<res<<endl; return 0; }习题 4.31
#include<iostream> #include<string> #include<cstring> using namespace std; int main(){ string s1; const size_t str_size=10; char res[str_size+1]; cout<<"请输入字符串"<<endl; cin>>s1; size_t len=strlen(s1.c_str()); //计算输入的字符串长度 if(len>str_size){ len=str_size; cout<<"过长的字符串"<<endl; cout<<"只能改变前"<<str_size<<"位数。"<<endl; } strncpy(res,s1.c_str(),len); res[len+1]='\0'; return 0; }习题 4.32
编写程序用int型数组初始化vector对象
#include<iostream> #include<vector> using namespace std; int main(){ const size_t arr_size=10; int arr_int[arr_size]; cout<<"input "<<arr_size<<" numbers"<<endl; for(size_t ix=0;ix<arr_size;ix++){ cin>>arr_int[ix]; } vector<int> ivec(arr_int,arr_int+arr_size); for(vector<int>::iterator iter=ivec.begin();iter<ivec.end();iter++){ cout<<*iter<<endl; } return 0; }习题 4.33
编写程序把int型vector复制给int型数组。
#include<iostream> #include<vector> using namespace std; int main(){ vector<int> ivec; int val; cout<<"请输入int型元素"<<endl; cin>>val; while(cin>>val){ ivec.push_back(val); } size_t len=ivec.size(); int *p=new int[len]; size_t ix=0; for(vector<int>::iterator iter=ivec.begin();iter<ivec.end();iter++,ix++) p[ix]=*iter; delete []p; return 0; }习题 4.34
#include<iostream> #include<vector> #include<string> using namespace std; int main(){ string s; vector<string> ivec; cout<<"input some strings:"<<endl; while(cin>>s) ivec.push_back(s); size_t len=ivec.size(); char **parr=new char*[len]; size_t ix=0; for(vector<string>::iterator iter=ivec.begin();iter<ivec.end();iter++,ix++){ char *p=new char[(*iter).size()+1]; strcpy(p,(*iter).c_str()); parr[ix]=p; } for(ix=0;ix!=ivec.size();++ix) delete [] parr[ix]; //释放字符数组 delete [] parr; //释放字符指针数组 return 0; }习题 4.35
#include<iostream> #include<vector> #include<string> using namespace std; int main(){ string s; vector<string> ivec; cout<<"input some strings:"<<endl; while(cin>>s) ivec.push_back(s); size_t len=ivec.size(); char **parr=new char*[len]; size_t ix=0; for(vector<string>::iterator iter=ivec.begin();iter<ivec.end();iter++,ix++){ char *p=new char[(*iter).size()+1]; strcpy(p,(*iter).c_str()); parr[ix]=p; } cout<<"vector对象内容为"<<endl; for(vector<string>::iterator iter=ivec.begin();iter<ivec.end();iter++) cout<<*iter<<"/t"; cout<<endl<<"字符数组对象为:"<<endl; for(ix=0;ix!=ivec.size();ix++) cout<<parr[ix]<<"\t"; for(ix=0;ix!=ivec.size();++ix) delete [] parr[ix]; //释放字符数组 delete [] parr; //释放字符指针数组 return 0; }