C++ 语言学习 day06 string , 异常
一.字符串string
string本质:c++中的字符串,string本质是一个类,内部维护了一个char*
为什么使用:string重载了超级多的运算符,有超级多的成员函数使用,用起来方便。
可以在MSDN中查看帮助:https://docs.microsoft.com/zh-cn/cpp/standard-library/string?view=msvc-170
1.构造:
第一个: string() 无参构造,创建一个空的字符串 “”
第二个:string(const char*) ; 输入一个字符串,构建一个对象
第三个:string(const string& str); 拷贝构造,用一个string构建另外一个string
第四个:string(int n,char c);用n个c来初始化string
2. 字符串的赋值(给字符串赋值修改原来字符串内容)
string& operator=(char *s) //1
string& operator=(string &s)
string& operator=(char c)
string& assign(char* s);
string& assign(string* s) //2
string& assign(char* s,int n); //把s字符串的n个字符赋值给原本字符串
3. 字符串的拼接(在字符串sting后追加新的字符串)
string& operator+=(char *s)
string& operator+=(string &s)
string& operator+=(char c)
string& append(char* s);
string& append(const string&* s)
string& append(char* s,int n);//追加字符串s中的n个字符到原来字符串后
string& append(const string& str,int pos,int n)//把字符串的str中pos+1开始的n个字符追加到原来字符串后
4.字符串的查找(替换)
int find(const string& str,int pos=0) 在pos开始的位置 查找str子字符串,返回是位置
int find(const char *str,int pos=0)
int find(const char *str,int pos,int n ) 从pos位置查找字符串str的前n个字符第一次出现的位置
int find(char c,int pos = 0); 从pos开始查找字符c在字符串的首位置
int rfind(const string& str,int pos=0) ;从后往前查找,返回找到的位置pos 从后面的那个位置开始.
5. 字符串的比较
int compare(string& s); //把原字符串和s字符串比较
int compare(char* s) // 把原字符串和s字符串比较,
完全相同返回 0
6.代码
#include <iostream>
#include<string>
using namespace std;
//string 的内容
int main(int argc, char *argv[])
{
/* //string构造函数
//建立string
string a;
char *s="abcdefg";
string b(s);
string c(b);
string d(10,'d');
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
*/
/*
//string 重载 = 赋值函数
char * name="gw";
string a;
a=name;
string b;
b=a;
char kk='g';
//string c='a';这个是构造 没有构造参数是 字符的情况
string c;
c=kk;
char *name1="ddddd";
string d;
string e;
string f;
d.assign(name1);
e.assign(d);
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
cout<<e<<endl;
cout<<f<<endl;
*/
/*
//字符串的拼接 (在字符串string )
string a;
a="abcdefg";
a+="aaaaaaa";
cout<<a<<endl;
string b("bbbbbbbb");
b+=a;
cout<<b<<endl;
b+='h';
cout<<b<<endl;
b.append(a);//string 追加函数
string c;
c.append("aaaaaaaa",1);//只追加 字符串的 1个字符
cout<<c<<endl;
*/
/*
//练习
char * name = "class2017";
string a=name;
a+=' ';
a+="is good";
cout<<a<<endl;
char *s="s ";
string b=s;
int c=a.find(b);//从字符串开头的地方开始查找
cout<<c<<endl;
int d=a.rfind(b,a.length());//从反方向开始查找,length(),string 的长度,rfind 的第二个参数是 查找的字符串的长度
cout<<d<<endl;
*/
string a("class2207");
string b("class2207");
string c("danny");
int d=a.compare(b);
int d1=a.compare(c);
int d2=c.compare("danny");//完成相同返回 0
cout<<d<<endl;
cout<<d1<<endl;
cout<<d2<<endl;
return 0;
}
二,异常:
什么是异常:是错误处理机制,当遇到问题后,不可以直接exit或者return时,需要给上一层处理。
流程:
try(检查)----->throw(抛出)----->catch(捕获)
throw:当出现问题时,程序需要抛出一个异常,通过throw+类型 抛出;
比如打开文件失败后,throw一个异常,告诉别人我出问题了,需要别人帮忙解决。
try: try中的代码是用来检测是否有异常,后面一般跟着catch
catch: 当出现问题后,try检测到问题后,catch来处理问题,防止出错。
格式:
try{ 各种代码;}catch(类型 变量){处理出现的问题}
代码:
#include <iostream>
using namespace std;
int fileCp(const char* dest,const char* src)
{
FILE* fp = fopen(src,"r+");
if(!fp)
{
throw 'a';
}
FILE* fp1 = fopen(dest,"r+");
if(!fp1)
{
throw -1;
}
char buf[128]= {0};
int readSize = 0;
int writeSize = 0;
while ( (readSize =fread(buf,1,sizeof(buf),fp)) > 0) {
writeSize =fwrite(buf,1,readSize,fp1);
if(readSize != writeSize)
{
throw 0.01f;
}
}
fclose(fp);
fclose(fp1);
return 0;
}
void testFile(const char* dest,const char* src)
{
try{
cout << "我是testFile"<<endl;
fileCp(dest,src);
cout << "我是在testFile中的filecp后的代码"<<endl;
}
catch(...) //三个点表示所有类型的异常
{
cout << "我是catch的代码,我啥也做不了"<<endl;
throw -1;
}
}
int main(int argc, char *argv[])
{
try
{
testFile("danny.txt","danny.log");
cout << "我是main中testFile后的代码"<<endl;
}
catch(char c)//捕获char 类型的
{
cout << "我是main中的catch" << c << endl;
}
catch(int c)//捕获int 类型的
{
cout << "我是main中的int 中 catch" << c << endl;
}
catch(...)
{
}
cout << "我是main中catch后的代码"<<endl;
return 0;
}