小渣渣一直被有关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:数组是不能复制的,小渣对此深有体会,上次考试就是这样编,最后连编译都没有通过,这是多么痛的领悟
但是我们的伟大的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)
暂时先这样以后有接着补充