以前看关于C++的书籍的时候,没有太多的去关注string的细节问题,因为平时用的基本都是关于string的都是类型之间的转换,把它当作一个字符数组来用。在C++ primer中对string进行了重点强调,仔细一点学习,有了很多新发现,这里记录一下,也许以后用到的时候会少返点错误。
初始化:string初始化的时候以前会犯这样的错误。。。就是声明了一个string 变量,然后需要它为空,就手动给其再初始化一次。其实string是个类类型,在定义的时候会调用其默认的构造函数(没有手动初始化的时候),这个构造函数会自动将此string变量初始化为空串。
string s1;
string s2(s1);
sting s3("value");
string s4(n,"c");
string s5(s3.begain(),s3.begain() + s3.size/2);
char*cp = "HiYa";
char c_array[] = "World!!!";
char no_null[] = {'H','i'};
string s6(cp);
string s7(c_array,5);
string s8(c_array+5,4);
string s9(no_null);//runtime error:no_null not null_terminated.使用这种格式的时候字,必须包含null结束字符,在字符数组中没有null这种错误是很严重的,而且无法检测
string s5(no_null,2);//指定格式,只要这个长度小于字符数组的中字符个数就行了,其只需要取到指定个数的字符即可,不需要null终止字符。
这几种方式都是可以的。
string读取:这个比较基本,只要记住读取时,忽略所有开头的空白符。再次遇到空白符的时候终止。所谓空白符包括空格,换行符,制表符
字符串和字面值的连接:s1 + "hello",前面s1为字符串, "hello"为字面值。这时候有些地方需要注意,当进行string对象和字符串面值混合连接时,+ 操作符左右两端必须有一个string类型。其中最关键的是两个字面值不能连接,然后赋值给字符串变量。下面几种情况可以清除的得出结论。
string s1("hello");
sting s2("world");
string s3 = s1 + " ," +s2 + "\n";
string s4 = s1 + ",";
string s5 = "hello" + ","; //这里是错误的,两个字面值不能连接
string s6 = s1 + "," + "world"; //这里是可以的,可以分成两部分,s1+","的到一个string temp,然后s6 = temp + "world";
string s7 = "hello" + "," + s2; //这里不行的,前两个都是字面值,不能直接连接
从string中获取字符,可以用索引值下表,跟普通的数组一样,很简单,只有一点要注意一下,在使用索引值的时候,最好用size_type,其为unsigned类型。这样就不用考虑其下标小于0的情况来了,防止出错。
string中一些字符的处理,string中封装了很多对于字符的操作函数,比如判断字符的类型,字母还是整形,标点,空白符等,这些可能比较常用,很多时候会避免自己去写一些比较搓的算法去判断。呵呵,yy。
温馨小tip:C标准库头文件命名形式name.h ,在C++中使用的cname。前面加C表示此标准库源于c标准库。