c++中关于char数组/char*指针/string类型 之间的爱恨情

小渣渣一直被有关string和char[]以及char*的相关问题弄得痛不欲生,传参、返回值、函数调用等到底应该用哪种形式这真的是让小渣癫狂了,今天就好好稍微整理一下吧(欢迎补充与指正)

大多也是我从各大网站各大博客上面自己整理的,毕竟小渣也是对这个问题感到orz,但是我不会轻易的狗带,接下来看吧……

…………………………………………………loading……………………………………………………………………………

C-串(C-strings):


introduce:char数组

char buffer[7] ="HELLO!";//虽然字符串只有HELLO!六个字符但是由于使用数组来表示字符串,字符后面还要有一个终止符'\n',因此char数组来表示字符串的时候其最后会默认的多一个结束符'\n',因此定义的char数组的大小是比字符串的lenght还要多1,如下表:

'H''H''L''L''O''!''\0'

C-串是char*类型,的更精确一点是const char* in fact 所有的字面值类型都是const的(这句话我还在琢磨)

 char*称为字符指针,虽然与字符数组的类型是不相同的,但是操作上是一样的。


★字符指针和字符数组

一段程序来看二者的联系与区别

<pre name="code" class="cpp">#include<iostream>

using namespace std;

int main(){
cout<<("join==join" ? "":"not")<<"equal"<<endl;

char* str1 = "good";
char* str2 = "good";
cout<<(str1==str2 ? "" :  "not")<<"equal"<<endl;

char buffer1[6] = "Hello";
char buffer2[6] = "Hello";
cout<<(buffer1==buffer2 ? "" : "not")<<"equal"<<endl;

return 0;
}
 


console:

not equal  //因为两个join的空间位置不同

not equal //两个指针指向的位置不同

not equal //两个数组位于不同的位置

"=="直接判断的是两个变量的位置,即是否在内存中处于一个位置,即是否为同一个对象

为了比较两个c串的内容是否相同 在C库中专门设计了strcmp(char* str1,char* str2)按字典序进行比较(你懂得,str1大返回正,等返回0,小返回负)


此外还有C-串的复制问题

char* str1 = "Hello";
char* str2 = str1;//意味着str1和str2共享一段内存空间,释放掉str1即释放掉str2,修改str1就是修改str2

char buffer1[6] = "Hello";
char buffer2[6] = buffer1;//error:数组是不能复制的,小渣对此深有体会,上次考试就是这样编,最后连编译都没有通过,这是多么痛的领悟

Reason:因为数组是定大小的,如果数组可以进行复制的话,那么将一个长度长的数组赋值给一个长度短的数组,这是多么丧病呀,所以一不做二不休,数组是不能的复制的

但是我们的伟大的C库中提供了大量的函数,解决了复制问题(①复制,但是却不是共享空间,而是空间不同内容相同②使字符数组或者C-串[只要是字符指针类型就好]的被复制到另一个中)

Let's see!

char* strcpy(char* x1 , char* x2);

//该函数将X2字符串的内容拷贝到X1所在的位置,不论X1之前是什么内容,拷贝之后都会被覆盖


char* strcat(char* x1 , char* x2);

//将X2字符串的内容接在X1之后


char* strrev(char* x)

//将x的内容倒置


char* strset(char* x ,char b)

//将X中的所有的字符都被字符b所替换


int strstr(char* x , char* s)

//在x字符串总查找s字符串,查找到返回1 否则0


int strchr(char* x , char b)

//在x字符串总查找b字符,查找到返回1 否则0


以上的函数在使用的时候,注意是否指针越界,编译器应该是不会帮助检查的,比如x1和x2复制或者拼接要考虑X1最后得到的x1的长度不能超出原来的x1的长度,否则指针会越界,可能会出现错误

    char str1[] = "Hello";                      //字符串数组  
    cout<<"sizeof(str1)="<<sizeof(str1)<<endl;    //sizeof计算占用的空间,包括\0  
    cout<<"strlen(str1)="<<strlen(str1)<<endl;    //strlen计算字符串长度,不包括\0  
  
    char* str2 = "Hello";                       //字符串指针  
    cout<<"sizeof(str2)="<<sizeof(str2)<<endl;    //sizeof计算指针=4 <span style="color:#ff0000;">I don't know why!! give me a hand </span>
    cout<<"strlen(str2)="<<strlen(str2)<<endl;    //strlen计算字符串长度,不包括\0

最后一段代码参考此博客--> 点此查看

string:

string是C++的STL提供的一种自定义的类型,它能方便的执行C-串不能直接执行的一切操作


1).定义与声明(definition&statement)

string的定义,如下

<span style="font-family:Comic Sans MS;">string str1 = “hello”;
string str2(“hello”);
string str3(15,'a');//十五个’a‘字符组成的字符串
string str4(15);//十五个空格字符组成的字符串</span>


2).关于"=="

string实体之间进行"=="的比较是直接进行字符串内容的比较

cout<<(str1==str2 ? "":"not")<<"equal"<<endl;//Anwser is "equal"!!!!


3).string类型还能进行"+"和"+="的拼接(同java)


4).string实体也是一种容器(参考vector)

 //2.string类  
    //a.定义和初始化  
    string s1;                          //默认无参构造,空串  
    string s2(s1);                      //拷贝构造  
    string s3(s2,0);                    //s2内位置字符初始化s3  
    string s4(str1);                    //使用c风格字符串初始化  
    string s5(10,'a');                  //生成个a的字符串  
  
    //b.常用操作  
    s1 = s5;                            //赋值,也可使用assign。s1内容清空,然后将s5的内容拷贝到s1处  
    s1 += s5;                           //尾部添加,也可使用push_back,append  
    s1.insert(0,str2);                  //插入字符(在0位置)  
    s1.size();                          //返回字符数量,也可用length  
    s1.c_str();                         //返回C—串,data()返回字符数组不包括\0,c_str()包括\0,  
                                        //copy()则把字符串的内容复制或写入既有的c_string或字符数组内  
    s1.empty();                         //检测是否为空  
    string::iterator iter = s1.begin(); //返回迭代器,rbegin为逆向迭代器  
  
    s1.compare(s2);                     //比较  
    s1.find('a',0);                     //从0位置开始查找a,返回位置  
    s1.replace(0,10,str2);              //删除从开始的10个字符中[0,10),然后插入str2  
    s1.erase(0,10);                     //删除从开始的10个字符[0,10)  

代码参考此博客--> 点此查看


暂时先这样以后有接着补充

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值