字符串的数组类型
char型
C++常用的是char型
‘\0’字符被称为空字符,作为结束标记使用,当程序从数组里读取到’\0’时,就知道要停止读取了,以’\0’为终止的字符串被称为C字符串
C字符串本质上是字符数组,储存的数据要比声明的少一,因为最后一位要放’\0’
C字符串声明时可以初始化,而且不需要填满它
C字符串声明时可以省略数组长度,但是有一点和正常的不一样
char a[] = {"asd"};
此时的数组长度为4,因为最后有’\0’
注意另一种声明方式
char a[4] = {"asd"};
这两者是等价的
注意不能这么声明
char a[4] = {"asdf"};
这样会系统会提示数组下标越界,因为没流出空间给’\0’
如果想要定义三个不要’\0’,可以这么定义
char a[] = {'a','s','d'};
srrncpy,strncat,strncmp这三个函数是C++< CString >提供的三个安全版本的函数
这三个函数都有三个参数
//以下操作将字符串"vcxz"的前两个赋给了a,a最后变成了"vcd"
char a[4] = {"asd"};
strncpy(a,"vcxz",2);
//以下操作将在a字符串后面添加一个'x'
char a[40] = {"asd"};
strncat(a,"x",1);
//判断a和字符串"asd"的第一位是否相同,相同返回0
//不同话,a大返回正值,a小返回负值
char a[40] = {"ase"};
int b = strncmp(a,"asd",1);
C字符串的输入和输出
char a[100];
char b[100];
cout<<"请输入:"<<endl;
cin>>a>>b;
cout<<a<<b<<endl;
输入如下
输出:
只读取了前面两个字符,因为cin读取时遇到空格自动结束
如果想要读取整行,需要用到getline函数,用法如下
char a[100];
cout<<"请输入:"<<endl;
cin.getline(a,100);
cout<<a<<endl;
这样就能读取一行了
如果把函数最后一个参数换成2,输出是
只读取了一个A,因为第二个要放’\0’
atoi,atol,atof
这三个函数都是将C字符串转化为对应的数值
atoi对应int
atol对应long
atof对应double
标准String类
string类需要加入预编译头#include < string>
操作符=可以为string变量赋值
string str;
str = "a"+"asd"+"weg";
这是合法的
string a = "asd";
string a("asd");
这两者初始化是等价的
String类的I/O
cin用法与char一致
getline略有差别,这里的getline不是成员函数,所以用法如下
string a;
getline(cin,a);
这里的getline在string库里定义的,cin也可以换成文件连接的流对象
用string类进行字符串处理
string类处除了char类行的处理外,还支持更多其他类型的操作
能够当数组使用,比如
string a = "asfasf";
cout<<a[4];
但是使用[]不会认为是非法的,可能出现有问题但是不报错的情况,比如超出数组长度之类的
所以推荐使用at函数,使用如下
string a = "asfasf";
cout<<a.at(4);
string对象和C字符串之间的转换
char a1[] = "asdfasf";
string a2;
a2 = a1;
这是合法的
但是,以下不合法
a1 = a2;
将string对象转换成对应的C字符串要用到c_str函数
string a;
a.c_str();
向量
向量类似数组,但还是有很多差别
向量的声明,如
vector<int> v;
这是定义了一个名为v,类型是int的向量
和数组一样,向量的编号也是从0开始的,向量也可以使用[],但是这个只能赋值,不能初始化
向量的初始化需要使用push_back函数或者用类似数组的初始化,如下
vector<int> a;
a.push_back(0);
a.push_back(1);
//或者这样
vector<int> a = {1,2};
向量元素个数称为向量的长度
成员函数size()判断向量有多少个元素,该函数只会返回unsigned int类型,该类型没有负数
向量在任何时候都有一个容量,即当前分配了内存的元素个数
容量一定大于等于长度