一、string
string C++的标准库类型(vector也是标准库类型),表示可变长的字符序列。使用时需要在头文件中包含
#include <string>
using std::string
初始化string对象的方式
string对象利用字符串初始化时,会除去末尾的空字符;
```
string s; //默认初始化,是一个空串
string s2(s1); //直接初始化,s2是s1的副本
string s3("value"); //直接初始化,s3是"value"的副本,除去末尾的空字符;
string s3(5, 'c'); //直接初始化,结果为“ccccc"
string s3 = "value"; //拷贝初始化,结果同上
```
读写string对象
int main()
{
string s;
cin >> s;
cout << s << endl;
return 0;
}
读取:会自动忽略开头的空白,从第一个真正字符读起,直到下一处空白;如输入" Hello ",输出会是"Hello";
可以使用getline进行读取整行的操作,可以保留输入在字符前后部分的空白字符。
int main()
{
string line;
while(getline(cin, line))
cout << line << endl;
return 0;
}
getline函数以一个输入流和string对象为参数,读取输入内容直到遇到换行符(换行符也被读进来),随后把内容存到string对象中去(不存换行符);
返回一个流参数;
string对象可以赋值、相加
标准库类型力求与内置类型相同;
两个string对象相加
string s1 = "hello", s2 = "world";
string s3 = s1 + s2;
s1 += s2;
字面值与字符串类型相加(必须有一个是string类型)
string s1 = "hello", s2 = "world";
string s3 = s1 + "," + s2 + "\n";
string对象具有下表运算符和迭代器。
与C风格字符串
string专门提供了一个返回C风格字符串的函数
string s = "hello";
const char *c = s.c_str();
二、字符型数组char a[]
关于数组
与vector相似与区别
相似:存放相同对象的容器,这些对象本身没有名字;
区别:数组大小确定,不能向里面随意添加。
其他
数组编译的时候,维度是已知的,必须是一个常量表达式。
数组不允许拷贝和赋值。
unsigned int = 42;
string a[cnt]; //错误,维度须为常量表达式
int a[] = {0, 1, 2};
int a2[] = a; //错误
a2 = a; //错误
数组元素被默认初始化。
字符数组的初始化
字符数组有一种额外的初始化方式:使用字符串字面值初始化。此时字符串字面值末尾的‘\0'也会被拷贝到字符数组当中。
char a1[] = {'C', '+', '+'};
char a2[] = "C++"; //{'C', '+', '+', '\0'}
指针和数组
在用到数组名字的地方,编译器会自动将其替换为指向数组首元素的指针。
同时指针也是迭代器。
char a[] = "hello";
char *p = a;
char *p = &a[0];
三、C风格字符串
字符串字面值是c++由c继承而来的C风格字符串。
C风格字符串存放在字符数组中,以空字符‘\0‘结束。
C标准库string函数/C风格字符串函数
关于头文件,参考<> "" .h说明
#include <cstring> //c语言头文件string.h的C++形式
函数:传入此类函数的指针,必须是以‘\0'作为结束的数组。
strlen计算字符串长度时,不包括末尾的空字符。
strlen(p) //返回p长度,不包括空字符
strcmp(p1, p2) //比较字符串
...
参数传递
数组形参
为函数传递一个数组时,实际上传递的是指向数组首元素的指针;
void print(const char*);
void print(const char[]);
void print(const char[10]);
上面三个函数是等价的。
注意:指针可能是字符的指针,也可能是字符数组首元素的指针。
main函数
int main(int argc, char *argv[])
int main(int argc, char **argv) //两个声明等价
第二个形参argv是一个数组,它的元素是指向C风格字符串的指针。
因为第二个形参是数组,所以上述两个定义等价。
其他
多维数组
多维数组名,转换得来的指针,是指向第一个内层数组的指针;
int a[3][4];
int (*p)[4]; //p指向含有4个整数的数组
p = &a[2]; //p指向a的尾元素
复杂数组
int *ptrs[10]; //ptrs是指向10个正形指针的数组
int &ptrs[10] = /* ? */; //错误,不存在引用的数组;
int (*Parry)[10] = &arry; //Parry指向一个函数10个整数的数组
int (&arrRef)[10] = arr; //arrRef引用一个含有10个整数的数组