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;
}