本文转载于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*称为字符指针,虽然与字符数组的类型是不相同的,但是操作上是一样的。
★字符指针和字符数组
一段程序来看二者的联系与区别
- <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)