C++复合类型(二)

来源:互联网 发布:linux 桌面 2017 编辑:程序博客网 时间:2024/06/05 00:25

2nd 字符串

C++处理字符串的方式分为两种:

来自C语言的C风格字符串处理方式;基于string类的字符串处理方法。

 

 

#C风格的字符串 //  #include<cstring>

 

C风格的字符串的特殊性质是:以空字符标记结尾。空字符写作\0,其ASCII码为0

在字符型数组中,所有以空字符结尾的数组都是字符串,其中以从左到右第一个空字符为字符串结束的标志。

 

char pineapple[9]={‘p’,’i’,’n’,’e’,’a’,’p’,’p’,’l’,’e’};

char pineapple[9]=pineapple;

1、以双引号括起的字符串隐式包括空字符

2、C++输入工具通过键盘输入,将字符串读入到char数组中是也将自动补上空字符。

3、确定存储字符串所需的最小数组时,空字符也要计算。

 

区分单引号与双引号:

1、单引号括起单个字符,表示一个字符常量,也是该字符编码的另一种表示方式。

如,在ASCII码中,‘A’是65的另一种表示方式。

2、双引号括起多于一个字符(隐式包含空字符),表示一个字符串的同时,表示该字符串所在的内存地址。

3、由双引号括起的字符串也叫做字符串字面值。相邻的字符串字面值会自动拼接,忽略两组引号中间的空白(空格,制表符,换行符等)。

 

区分sizeof()strlen()

1、sizeof()是个运算符,计算的是整个变量(也许是整个数组变量)所占的字节数。

2、Strlen()是个函数,计算字符串所含的可见字符数(非空字符)。不包括空字符。

 

 

字符串的输入:

1、按单个单词的输入:std::cin>>str

2、按单行输入(回车键输入的换行符作为输入终点):

getline()(丢弃换行符)

   get()(换行符保留在输入队列中)

3、读入连续两行:

     方法一:cin.get(name,size);

 cin.get();

 cin.get(dessert,size);

 

 方法二:cin.get(name1,size).get();

 cin.get(name2);

 

方法三:cin.getline(name1,size).getline(name2,size);

 

函数重载:cin.get();   //input a char.

          cin.get(name,size);   //input a string.

 

4、get()getline()的比较:

可以直接查看get()的下一个字符是不是换行符,确定停止读取的人原因是已经正常读取,还是因为数组已满。

但是getline()明显更简单。

5、get()读取空行后会设置失效位failbit,接下来的输入会被阻断,需要用cin.clear();恢复。

6、当输入长度比指定的大,getline()还是会设置失效位,关闭后面的输入。

7、Std::cin输入数字时,std::cin会把回车生成的换行符留在输入队列中,导致后面的getline()认为是空行,直接将空字符赋给数组。解决办法:

方法一:cin>>num;

cin.get();

方法二:(cin>>num).get();//cin>>num返回一个cin对象,用于调用get()

 

 

 

#string//  #include<string>

 

特征:使用string类型的变量(是对象,不是字符数组)来存储字符串。

(这样,字符串就可以成为和int,double的变量一样的单一变量,而不是组合型变量。String字符串本身就是一个车厢,而不是一列有着多个车厢的火车)

 

string实际上是模板具体化basic_string<char>的一个typedef,省略了内存管理相关的参数。

 

string对象的最大允许长度,由常量string::npos指定。这通常是最大的unsigned int值。

 

String字符串的输入输出:

可以用cincout

C风格的字符串 cin.getline(a1);

cin.getline(a1,56,’:’);

cin.operator>>(fname);

string字符串     getline(cin,a1);//read a line,auto adjust size,discard \n

getline(a1,’:’);//read a line,discard :

operator>>(cin,lname);

 

stringgetline()结束读入的原因:

1、到达文件尾部,输入流被设置为eofbit,则fail()eof()都返回true

2、遇到分界符(默认是\n),分界符不会再保留在输入流中。

3、读取的字符数达到最大允许值(min(string::npos,可供分配的内存字节数)),输入流会被设置为failbit,则fail()会返回true

 

stringoperator>>( )不断读取并且把空白字符留在输入队列中直到遇到分界字符并把它丢弃。

 

输入流对象有一个跟踪流错误的统计系统。检测到文件尾将设置eofbit寄存器,检测到输入错误则设置failbit寄存器,无法识别的故障则设置badbit寄存器,输入成功则设置goodbit寄存器。

 

赋值和表示:

可以用C风格的字符串给string类型的变量赋值,

也可以使用数组表示法来访问string类型的字符串。

string snack=”hualahualahualala”;//inicialization

string mango={“xilixilixilili”} //That’s ok if you like.

getline(cin,snack);

 

string类的构造函数(7个加上C++11新增的两个

构造函数:

#include<iostream>

#include<string>

using namespace std;

 

int main()

{

string a1("Beauty and the Beast")

//string(const char *s)

string a2(6,'*');

//string(size_type num,char ch);

string a3(a1);

//string(const string & str)

string a4();

//创建一个默认构造函数,长度为0

string a5("Toy Story",3);

//string a5(const char *s,size_type n)

string a6(a1+7,a1+10);

//template<class Iter>

//string(Iter begin,Iter end)包括begin不包括end

string a6(a1,0,5);

//string a6(const string& str,string size_type pos=0,size_type n=npos)

string a7(&a1[11],&a1[19]);

return 0;

}

 

C++11新增的:

1、string(string &&str)noexcept

//移动构造函数。类似于复制构造函数,但是被复制的字符串不一定是const,可以优化性能。

2string(initializer_list<char> il)

//使得string piano_man={‘L’, ’i’, ’s’, ‘z’, ‘t’};合法

 

程序解析:

1、对象名不会像数组名一样被看作对象地址,因此对象名不是指针类型的。但是 对象名[n] 是一个char值,&对象名[n]是一个地址。

 

 

使用:

1、重载后的<>==>=<=、 !=

2、重载后的find():

例子:int where=kiwi.find_last_of(“huala”);

3、kiwi.size()kiwi.length()都返回字符串中的字符数

4、capacity()          //容器能存储数据的个数

5、size()               // 容器目前存在的元素数

6、reserve()          //指定容器能存储数据的个数

7、resize()          //重新指定有效元素的个数,区别与reserve()指定容量的大小

例子:

vector a;  //没有初始化size()capacity()都为0  

a.push_back(1);  

//容器内有一个元素,size()1capacity()1  

a.push_back(1);

 //容器能够提供的空间capacity()不够用,需要申请,申请后的大小是先前的2倍,所以是2,这时有两个元素,size()为2capacity()为2  

cout<<v.size()<<endl<<v.capacity()<<endl;

v.push_back(1);

  //容器能提供的空间是2,增加元素,不够空间,需要申请,申请后的空间为原来2倍,就是4了。因此size()3capacity()为4  

v.push_back(1); 

 //容器还能提供一个空间,不需要申请,size()4capacity()为4  

v.push_back(1); 

 //空间不够,需要申请,size()5capacity8

 

 

 

 

使用:

#include<string>

usingnamespace std;

string lychee,longan;

longan=”sweet”;

lychee=longan;

lychee+=longan;

int len_lyc=lychee.size();

 

对比C风格字符串:

#include<cstring>

using namespace std;

char lychee[12],longan[12];

lychee=“sweet”;

strcpy(longan,lychee);//copy lychee to longan.

Strcat(longan,lychee);//add lychee to longan.

int len_lgn=strlen(longan);

 

strcpy()strcat()出错保护版本:

strncpy()strncat()——提供第三个参数,数组最大允许长度。

 

如果变量是string对象,但是需要C风格字符串,则使用c_str()方法返回一个指向C风格字符串的指针。该C风格字符串内容与用于调用c_str()方法的string对象相同。

例子:

string filename(“apple”);

cin>>filename;

ofstream fout;

fout.open(filename.c_str());

 

 

 

其它形式的字符产字面值

字符串类型:char(无前缀)、wchar_t(前缀为L)、char16_t(前缀为u)、char32_t(前缀为U

例子:

wchar_t kiwi[]=L”It’s a lovely fruit.”;

char16_t avocado[]=u”It looks like a kiwi. ”;

char32_t cup[]=U”Oops!It isn’t a fruit.”;

 

C++11

1、支持Unicode字符编码方案UTF-8:

字符被存储为14个八位组,用前缀u8表示这种字符串的字面值。

 

2、新增一种类型:原始字符串(所有的字符就表示自己)

特征:原始字符串用 ”( )” 作为默认定界符,并且带有前缀R

 

使用: 1)输入原始字符串时,按回车不仅会移动到下一行,而且会在原始字符串中加入回车字符。

2)如果原始字符串中含有”(或者)” 可以在默认定界符中插入任意数量的基本字符,控制字符(制表符,换行符)、空格、左右括号、斜杠除外,定义一个自定义定界符。

例子:cout<<R”#+( The row string begins with “( and ends with )”.)#+”<<endl;

输出: The row string begins with “( and ends with )”.

 

string的分类:

typedef basic_string<char>  string;

typedef basic_string<wchar_t>  wstring;

typedef basic_string<char16_t>  ustring;//C++11

typedef basic_string<char32_t>  Ustring;//C++11

By Little_Small_Joze and Katlynn 网络加速 kiwimini.net


原创粉丝点击