c++primer学习笔记(4.3) C风格的字符串

4.3  C风格的字符串


c++尽管支持c风格的字符串,但不该在c++中使用这个类型。c风格的字符串常常带来许多错误!

#include<cstring>

cstringstring.h头文件的c++版本

c风格的字符串是以空字符null("\0")结束的字符数组。


c风格字符串的的标准库函数
strlen(s)             返回s的长度,不包括null字符!!注意与sizeof()函数的不同

strcmp(s1,s2)   比较s1s2是否相同,若相同放回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

编写程序把intvector复制给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;
   }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值