c++中关于char数组/char*指针/string类型

本文转载于http://blog.csdn.net/qq_19851167/article/details/50499777




小渣渣一直被有关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*称为字符指针,虽然与字符数组的类型是不相同的,但是操作上是一样的。


★字符指针和字符数组

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

[java]  view plain  copy
 print ?
  1. "code" class="cpp">#include  
  2.   
  3. using namespace std;  
  4.   
  5. int main(){  
  6. cout<<("join==join" ? "":"not")<<"equal"<
  7.   
  8. char* str1 = "good";  
  9. char* str2 = "good";  
  10. cout<<(str1==str2 ? "" :  "not")<<"equal"<
  11.   
  12. char buffer1[6] = "Hello";  
  13. char buffer2[6] = "Hello";  
  14. cout<<(buffer1==buffer2 ? "" : "not")<<"equal"<
  15.   
  16. return 0;  
  17. }  
 
  


console:

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

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

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

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

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


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

[cpp]  view plain  copy
 print ?
  1. char* str1 = "Hello";  
  2. char* str2 = str1;//意味着str1和str2共享一段内存空间,释放掉str1即释放掉str2,修改str1就是修改str2  
  3.   
  4. char buffer1[6] = "Hello";  
  5. 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的长度,否则指针会越界,可能会出现错误

[cpp]  view plain  copy
 print ?
  1. char str1[] = "Hello";                      //字符串数组    
  2. cout<<"sizeof(str1)="<<sizeof(str1)<//sizeof计算占用的空间,包括\0    
  3. cout<<"strlen(str1)="<//strlen计算字符串长度,不包括\0    
  4.   
  5. char* str2 = "Hello";                       //字符串指针    
  6. cout<<"sizeof(str2)="<<sizeof(str2)<//sizeof计算指针=4 I don't know why!! give me a hand   
  7. cout<<"strlen(str2)="<//strlen计算字符串长度,不包括\0  

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

string:

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


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

string的定义,如下

[cpp]  view plain  copy
 print ?
  1. "font-family:Comic Sans MS;">string str1 = “hello”;  
  2. string str2(“hello”);  
  3. string str3(15,'a');//十五个’a‘字符组成的字符串  
  4. string str4(15);//十五个空格字符组成的字符串  


2).关于"=="

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

cout<<(str1==str2 ? "":"not")<<"equal"<


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


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

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

你可能感兴趣的:(c/c++)