字符指针,字符串,字符数组比较以及衍生问题

字符指针、字符数组不能直接比较

 strcmp()         对两个字符串进行大小写敏感的比较
 strcmpi()        对两个字符串进行大小写不敏感的比较
 stricmp()        同strcmpi()
 strncmp()       对两个字符串的一部分进行大小写敏感的比较
 strnicmp()      对两个字符串的一部分进行大小写不敏感的比较

(此部分复制网上部分,见谅,大家重复太多啦)

STL标准库中的std::string重载了==运算符
使得string可以直接和const char* (C风格字符串)直接比较
St.replace()//替换
St.size();//返回长度(不包含空字符)
St2.empty()//检查是否是空
//复制两个字符串
String st3(st);
St2=st3
//比较是否相等
If(st2==st3){….}
/两个字符串连接成第三个字符串
String s1(“hello,”);
String s2(“world!”);
String s3=s1+s2;
//或者,直接加到s1
S1+=s2;
//可以把一个c风格的字符串转换成string类对象
Const char *pc=”a try”;
String s1=pc;//ok
//但,反向的转换不能自动执行
Char *str=s1;//error
为实现这种转换必须显示调用名为c_str()
//几乎正确的
char *str=s1.c_str();
但为了防止字符数组被程序直接处理,c-str()返回的一个指向常量数组的指针:const char*,str被定义为非常量指针,所以违例。正确是:
Const char *str=s1.c_str();//ok

St.compare()//比较


例子:

char buf[] = "Geooo";// 其末尾还包括了一个\0, 是一个数组,可以改变数组中保存的内容( 字符数组
char* buf1 = "Geooo";// 字符指针指向的是一个字符串常量的首地址,可以改变它指向不同的字符串,但不能改变所指的字符串常量(字符指针)
string buf2 ="Geooo";(字符串)// 新的C++标准 C++11里面规定std::string一定是以'\0'结尾 就看你的编译器有没有实现新标准了
char buf3[] = {'G','e','o','o','o'};( 字符数组
char buf4[] = {'G','e','o','o','o','\0'};( 字符数组)等价于buf[]

bool ibool=strcmp(buf2.c_str(), "Geooo");//buf,buf1,buf2,buf4用strcmp比较都是相等,返回0
bool ibool = strcmp(buf, buf3)//1
bool ibool = strcmp(buf, buf4)//0
bool ibool = strcmp(buf3, buf4)//1

if (buf == "Geooo")//不等
if (buf1 == "Geooo")//相等
if (buf2 == "Geooo")//相等
if (buf3 == "Geooo")//不等
if (buf4 == "Geooo")//不等

if (buf == buf2)//相等
if (buf1 == buf2)//相等
if (buf == buf1)//不等
if (buf == buf4)//不等

cout << strlen(buf);//5
cout << sizeof(buf);//6, 字符串数组,编译自动在后面加上了"\0"结束符

cout << strlen(buf1);//5
cout << sizeof(buf1);//4,指针的字节数

cout << strlen(buf2.c_str());//5
cout << sizeof(buf2);//28,string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的
cout << sizeof(buf2.c_str());//4,指针的字节数

cout << strlen(buf3);//19,不定, 原来strlen在计算数组长度的时候是遇到‘\0’时计算就停止,如果不在字符数组后面加上‘\0’,那么strlen就会一直计算下去,知道遇到内存中的'\0',才停止计算。
cout << sizeof(buf3);//5,字 符数组,编译器不会再后面加"\0"结束符

cout << strlen(buf4);//5
cout << sizeof(buf4);//6

buf[0] = 'l';//可以, 由字符串常量初始化的数组是可以修改的
buf1[0] = 'l';//错误,字符指针指向的是一个字符串常量的首地址
buf2[0] = 'l';//可以
buf3[0] = 'l';//可以

cout<<sizeof(buf3) / sizeof(buf3[0]);//5

char buf5[] = {'Goo','e','o','o','o','\0'};
cout<<sizeof(buf5) / sizeof(buf5[0]);//6

char* buf6[] = {"Goo","e","o","o","o","\0"}; 指针数组
cout<<sizeof(buf6) / sizeof(buf6[0]);//6

char* buf7[] = {"Goo","e","o","o","o"}; 指针数组
cout<<sizeof(buf7) / sizeof(buf7[0]);//5

字符串与字符数组
对字符串指针方式,char *ps=”C Language”;
可以写成char *ps;ps=”C Language”;
而对于数组方式,char st[]={”C Language”};
不能写成char st[20];
St={”C Language”};
只能对字符数组的各元素逐个赋值。


指针数组和数组指针的区别

int* a[4]     指针数组     
                 表示:数组a中的元素都为int型指针    
                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*
int (*a)[4]   数组指针     
                 表示:指向数组a的指针
                 元素表示:(*a)[i]  


字符指针如何判断字符串结束

int i = 0;
while (*buf1 != NULL)
{
buf1++;
i++;
}
cout << i << endl;//5


sizeof和strlen


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值