C++学习笔记摘录十三.docx
《C++学习笔记摘录十三.docx》由会员分享,可在线阅读,更多相关《C++学习笔记摘录十三.docx(28页珍藏版)》请在冰豆网上搜索。
![C++学习笔记摘录十三.docx](https://file1.bdocx.com/fileroot1/2023-4/19/abce2d2e-4517-4179-bac2-8247fad8fa99/abce2d2e-4517-4179-bac2-8247fad8fa991.gif)
C++学习笔记摘录十三
C++学习笔记
SkySeraph2010-7-31阅读整理
摘自:
18章:
字符串
1:
#include
usingnamespacestd;
intmain()
{
charman[12]={"HelloWorld"};
cout< cout<<"strlen:
"< cout<<"sizeof:
"< man[5]='\0';//由于是字符,不是字符串所以使用单引号。
cout<<"strlen:
"< cout<<"sizeof:
"< return0;
}
2:
#include
#include//加载一个string 类。
string是C++的一个类,他的定义的一个字符串可以看做是string的对象。
在使用string的时候必须使用包含
usingnamespacestd;
intCheck(charch[]);
intmain()
{
stringstr="string型字符对象\n";//初始化字符串
charch[]="char字符型数组\n";
cout< cout< cout<<"请输入狗的英文单词:
";
cin>>str;
if(str=="dog")
{
cout<<"狗:
"< cout<<"strd的第一个字符为:
"< }
else
{
cout<<"输入错误!
"< }
cout<<"请输入猪的英文单词:
";
cin>>ch;
if(Check(ch)==1)//我们这里输入对了为什么还是提示输入错误呢?
上面都可以啊,那是因为ch是个数组名,而数组名的第一个元素保存的是数组的内存地址,但是我们输入的p是咋都和他不相等的所以始终会执行else分支。
要解决必须要使用循环也就是使用Check函数。
当然我们也可以使用strcmp函数来进行对两个数的比较,strcmp(ch,"pig")是最方便的。
{
cout<<"猪:
"< cout<<"ch的第一个英文单词是:
"< }
else
{
cout<<"输入错误!
"< }
return0;
}
intCheck(charch[])
{
charch1[]="pig";//我们在定义一个保量保存正确答案
boolquit=false;
for(unsignedinti=0;i {
if(ch[i]!
=ch1[i])//这里的判断是取出 传递的参数和 我们上面定义好的变量的第一个字符也就是p来判断的是否不等于如果不等于就返回真,然后退出,依次循环,第二个就判断i然后g
{
quit=true;
break;
}
}
if(quit==false)//如果上面没有执行quit=true那么就说明全部相等就执行返回1如果上面表达式成立就返回0
{
return1;
}
else
{
return0;
}
}//这就是他们的区别,由于string重载了关系运算符==等其他运算符,因此,string允许使用运算符对他的字符串进行比较
3:
#include
#include
usingnamespacestd;
intCheck(charch[]);
intmain()
{
stringstr1="str1型字符对象\n";
stringstr2="str2型字符对象\n";
charch1[]="ch1字符型数组\n";
charch2[]="ch2字符型数组\n";
cout< cout< str1=str2;//当我们要进行字符串的赋值的时候那么string类可以直接赋值
cout< cout< cout<<"\n";
cout< cout< strcpy_s(ch1,ch2);//而char字符数组就不行了,只有通过函数来实现对考
cout< cout< //str1.assign(str2,3,1);我们也可以这样取出,assign是赋值操作,他的意思是第一个参数为要取的类型,第二个参数开始位置,第三个参数取得大小
return0;
}
4:
#include
#include
usingnamespacestd;
intCheck(charch[]);
intmain()
{
stringstr1="str1型字符对象\n";
stringstr2="str2型字符对象\n";
charch1[30]="ch1字符型数组\n";//字符串的合并,我们需要使用到一个函数而在变量的内存数据对考的时候,我们都需要注意,他们的大小是否能够容纳。
所以我们这里给他一个大点的值
charch2[]="ch2字符型数组\n";
cout< cout< str1=str1+str2;//把大小相加
cout< cout< cout<<"\n";
cout< cout< strcat_s(ch1,ch2);//char也和上面一样必须通过函数进行合并操作,也是成功了的。
cout< cout< //strncat(ch1,ch2,4);这个函数可以拷贝部分,意思是把第二个参数的长度拷贝给第一个参数
//str1.append(str2,3,4);而string类可以使用append成员函数来进行部分拷贝。
第一个参数是要拷贝的类型,第二个是从那个地方开始第三个是多少个字符
//strncpy_s(ch1,ch2,3);而这个函数的意思是拷贝部分第二个参数的多少个覆盖第一个参数!
str1.replace(0,1,str2,4,5);//这个是一个重载函数,他的作用是把指定的str2中的位置4的5个长度拷贝给str1中的第0个位置的1个长度的字符。
需要注意的是开始位置为0也就是说上面的第4个参数是4有这么一个"abcdefg"那么就是从e开始拷贝5个字符
//memmove(ch1,ch2,10);这个函数的作用是把ch2中的10个字符覆盖到ch1中。
//str1.copy(ch1,4,6);这儿可以实现string对char类型的拷贝覆盖。
也就是把str1中的内存拷贝到ch1中拷贝 第二个参数表示赋值的个数第三个参数表示从哪儿开始。
//str1.insert(2,str2,0,4);这个的意思是第一个参数的表示从str2中的哪个位置开始插入,第二个参数的意思是要插入到的string对象,第三个参数是从string对象的那个位置开始拷贝,第四个参数表示要插入的大小或者长度
//str1.erase(2,3)这个成员函数的意思是删除对象中的一段字符,第一个参数的意思是从哪儿开始第二个参数的意思是删除后面的几个,如果为空代表从第一个参数的后面全部删除,如果第一个也为空那么就表示清空!
!
return0;
}
还有两个常用的如下:
#include
#include
usingnamespacestd;
intmain()
{
strings1="12345";
strings2="54321";
charc[]="34";
inti,j,k,l,m,n;
i=pare(s2);//将s2和s1进行比较,如果s1大于s2返回1如果小于就返回-1如果相等返回0;
j=pare(c);//将char型字符串和s2相比较,返回如上。
k=pare(0,2,s2);//取s2的第二个字符来与s1相比较,参数1表示要取s1的长度。
l=pare(1,1,s2,0,1);//取s1的第二个字符和S2的第1个字符想比较,第二和最后一个参数表示s1和s2的长度。
m=pare(1,1,c,0,1);
n=pare(1,1,c,1);
cout<"< cout<"< cout<"< cout<"< cout<"< cout<"< if(s1.empty())//empty函数表示取字符是否为空的意思
{
cout<<"字符为空!
\n";
}
else
{
cout<<"有字符\n";
}
return0;
}
5:
#include
#include
usingnamespacestd;
intmain()
{
charch1[15]="ofru";
charch2[15]="";
constchar*ch3;//string中转换成char的返回值是一个常量的char型指针
_swab(ch1,ch2,sizeof(ch1));//char字符的交换函数,用于交换第一个参数中的偶数和奇数交换,比如这里ofru那么交换过来o是奇数f是偶数,那么他们要交换fo而后面的ru也同样r是奇数,u是偶数那么他们也交换,ur输出的结果就是four这个就是_swab交换功能,最后的参数是长度。
也就是交换长度
cout<<"ch1:
"< cout<<"ch2:
"< stringst1="givemethememory";
stringst2="dodream";
st1.swap(st2);//这个是string类的交换函数,我们看到是成功吧st1和st2中的字符串成功交换了的。
cout<<"st1:
"< cout<<"st2:
"< ch3=st1.c_str();//把string转换成char型,他的返回值是一个常量指针
cout<<"ch3:
"< return0;
}
char型函数:
#include
#include
usingnamespacestd;
intGet(constchar*p);//申明一个常量指针,p,假如我们试图修改这个原始的字符串比如下面的*p那么就会报错,,当然你也可以使用p[]数组方式
intmain()
{
charch1[15]="HelloWorld";
char*p="VeryWell";
cout<<"CH1:
"< cout<<"P:
"< return0;
}
intGet(constchar*p)
{
intNumber=0;
while(*p)//由于我们知道字符串结束标志是\0所以当他不断循环自加操作下一个字符的时候他会遇到0来结束而0也代表假,那么我们就可以得到字符串的长度了。
{
Number++;
p++;//这里需要注意我们不能返回p因为p是指向字符串的 p++会不断指向他字符串的下一个字符直到为0 所以如果返回p那么就是返回的0了!
}
returnNumber;
}
返回字符串!
#include
#include
usingnamespacestd;
char*Get(char*p);
intmain()
{
chari[22];
char*ch;//由于Get函数返回值是char型的指针,所以我们也要这样定义用于接收返回
cout<<"请输入你的名字:
";
cin>>i;
ch=Get(i);//
cout<<"你的名字是:
"< delete[]ch;//删除指针
return0;
}
char*Get(char*p)
{
char*str=newchar[strlen(p)+1];//为str字符串创建一个刚好能容纳参数p大小的空间
strcpy_s(str,strlen(p)+1,p);//把参数p的值拷贝给str,中间参数的意思是缓冲区大小,我们把p的实际大小传递给他!
cout< returnstr;//返回
}
6:
结构体
#include
#include
usingnamespacestd;
structA//定义一个结构体,结构体与类的定义方法相同,只是关键字不同。
{
public:
//在C++中结构体被强化了。
他与类的不同之处只在于结构体是默认公有,而雷是默认私有,所以这里不加public也是可以的。
intGet()
{
returnx;
}
voidSet(inty)
{
x=y;
}
private:
intx;
};
structPeop//当然我们也可以吧结构体当作数据类型来使用如下,这样我们给peop这个结构体定义了以下数据类型分别是体重,身高,年龄,名字,出生地,和性别!
{
doubleWeight;
doubleTall;
intAge;
char*Name;//vc++2005以上可以直接使用string类来进行定义,但是vc6需要改下因为不支持这种新特性。
char*Native;
boolSex;
};
voidCheckSex(ints)
{
if(s==1)
{
cout<<"男";
}
else
{
cout<<"女";
}
}
intmain()
{
Aa;//调用方法也相同。
a.Set
(2);
cout< Peopjack=//结构体的初始化。
每行一个或者写在一行都可以逗号分隔参数赋值的值。
{
180,
60,
18,
"Jack",
"Chain",
1
};
cout<<"Jack:
"< cout<<"Jack:
"< cout<<"Jack:
"< cout<<"Jack:
"< cout<<"Jack:
"< cout<<"Jack:
";
CheckSex(jack.Sex);
cout<<"\n";
//另外说一点他们之间的赋值 比如还有一个Milk他的结构体也是Peop那么他们两个值要参数一样都可以直接赋值,Milk=Jack就可以了,你会看到他们输出的值是一样的。
。
return0;
}
7:
结构体与函数
#include//计算两天时间相加后的总计时间。
#include
usingnamespacestd;
structTime
{
intHour;
intMinute;
};
constintPerHour=60;//定义一个常量并把它初始化为60
TimeSun(Timet1,Timet2);//申明两个函数他返回一个time结构体参数也是time结构体
voidShow(Timet);
intmain()
{
Timeone={8,15};//初始化第一个Time结构体的变量,ONE
Timetwo={6,55};//第二个
Timeday=Sun(one,two);//Sun传递传输ONETWO两个结构体。
进入函数
cout<<"两天总计:
";
Show(day);//从函数的结果计算出15:
10
Timeday3={9,35};
cout<<"三天总计:
";
Show(Sun(day,day3));//这里也和上面一样,不过day传递的是15:
10所以计算结果不同。
return0;
}
TimeSun(Timet1,Timet2)//函数具体实现部分
{
TimeTotal;//定义一个Time结构体
Total.Minute=(t1.Minute+t2.Minute)%PerHour;//进入计算分钟,这里就是 15+55=70,70除以60然后取余就是10,然后返回给Total.Minute=10
Total.Hour=t1.Hour+t2.Hour+(t1.Minute+t2.Minute)/PerHour;//这里的计算方式是t1的小时加t2的小时,也就是8+6就是14 然后由于括号优先级最大然后计算出结果分钟为70然后除号的优先级大于+ 然后就是70/60计算出结果为1.1XXXX我们定义的是一个整数int型,所以只会返回1 余数不算,所以小时的结果是15;那么Total.Hour=15;
returnTotal;//返回Total(15,)
}
voidShow(Timet)
{
cout<"<10
}
================
#include
#include
usingnamespacestd;
structTime
{
intHour;
intMinute;
};
constintPerHour=60;
Time&Sun(Timet1,Timet2);//取Sun的地址
voidShow(Timet);
intmain()
{
Timeone={8,15};
Timetwo={6,55};
Time*day=&Sun(one,two);//由于Sun已经被定义为引用,所以这里也需要要不然类型不匹配。
day是指针
cout<<"两天总计:
";
Show(*day);//指针指向的是Sun所以我们可以正常取出day的值。
Timeday3={9,35};//指针必须指向一个实际存在的地址的值,我们这里不能为他使用指针的原因就是day3他后面跟的非地址而是初始化结构体的值!
所以他并不是一个地址
cout<<"三天总计:
";
Time*p1=&Sun(*day,day3);//这里也一样day前面已经被定义为指针所以这里也需要是指针
Show(*p1);//同上需要用指针!
deleteday;//删除!
deletep1;
return0;
}
Time&Sun(Timet1,Timet2)
{
Time*Total=newTime;
Total->Minute=(t1.Minute+t2.Minute)%PerHour;
Total->Hour=t1.Hour+t2.Hour+(t1.Minute+t2.Minute)/PerHour;
return*Total;
}
voidShow(Timet)
{
cout<"<}//上面那个是按值返回,我们都知道按值返回要复制对象,结构体可以容纳不同类型的变量,响应产生的问题是复制的数据也很多,如果我们不想这样,可以按照按地址返回!
8:
Sting与函数和数组:
#include
#include