#include<iostream>
using namespace std;
#include<string>
using std::string;
#include<cstring>
void main()
{
char *p1;
//用输入输出会出现内存不可读的错误
//使用输入初始化字符指针应先为指针分配内存
char *q1=new char[10];
cout<<"请输入一个字符串:";
cin>>q1;
cout<<q1;
//将c风格字符串赋值给字符指针不用&符号
p1="yangfei";
//字符串用char指针输出不用解引用
cout<<p1<<endl;
//若对char指针解引用,则只是输出第一个字符
cout<<*p1<<endl;
//string对象的指针
string p2("yang fei");
//指针赋值时要对对应string对象取地址,输出要对对应对象解引用
string *pp2=&p2;
cout<<*pp2<<endl;
//c风格字符串末尾有'/0'作为结束标志
char p3[]="yang fei";
//c风格字符串用数组及其下标访问其中字符
for(int i=0;p3[i]!='/0';i++)
{
cout<<p3[i]<<"/t";
}
cout<<endl;
//c风格字符串用指针访问其中字符
char *p5=p3;
//方法1
//结束时*p5='/0',在条件表达式中为假,也可将'/0'换为NULL
while(*p5)
{
cout<<*p5<<endl;
p5++;
}
//方法2
//c++中用NULL而不用null
for(p5=p3;*p5!='/0';p5++)
{
cout<<*p5<<"/t";
}
cout<<endl;
//char指针同样可用字符数组名赋值
char *p4=p3;
cout<<p4;
cout<<endl;
//C字符串的标准库函数 头文件<cstring>
//函数中的字符串参数通过字符数组名或字符指针传递,其实质都是字符串首地址
char *p6="yangfei";
int j=strlen(p6);//strlen返回的长度不包括'/0'
cout<<j<<endl;
char *p7="yang fei";
int k=strcmp(p6,p7);//1
cout<<k<<endl;
int l=strcmp(p7,p6);//-1
cout<<l<<endl;
int m=strcmp(p6,p6);//0
cout<<m<<endl;
//使用strcpy(s1,s2) strcat(s1,s2) strncat(s1,s2,n) strncpy(s1,s2,n)要注意字符数组或指针的长度
//将一个字符串catch到另一个char *指针上,其第一个字符会覆盖目标字符串的结束符'/0'
char *p8=new char[9];
char *p9="yang";
char *p10="fei";
strcpy(p8,p9);
cout<<p8<<endl;
strcat(p8," ");
strcat(p8,p10);
cout<<p8<<endl;//yang fei
//pa输出有错误
char *pa=new char[5];
strncpy(pa,p8,4);
cout<<pa<<endl;
//char *类型可赋值给string对象,应用string的+=号
string p11=p8;
cout<<p11<<endl;
p11+=" ";
//char *指针创建时要么用c字符串初始化,要么不进行初始化但应分配内存
char *p12="wu di";
p11+=p12;
cout<<p11<<endl;
//新旧代码兼容 c字符串初始化或赋值string对象,可用作string加法操作的一个操作数,复合赋值操作的右操作数
//但不能用string对象初始化字符指针 可用c_str()函数将string对象返回为指向字符数组首地址的指针 内容与string对象
//相同,并以null结束 但它返回的指针指向const char类型的数组
string p13("yang fei");
const char* p14=p13.c_str();
cout<<p14<<endl;
}