一 概述
什么是字符串?字符串是以空字符结尾的字符数组。
由于char占用一个字节的空间,为了让char能够存储更多的字符,我们用了数组的方式。
二 char数组
2.1 示例
1
| char man[6]={'h','e','l','l','o','\0'};
|
2.2 分析
- 然而该char型数组man却不是这一个字符串,因为它没有字符串的结束标志——'\0'。只有我们为其添加"\0"这个结束标志后,这个char型数组man才转化为字符串
- 请不要小看这个代表字符串结束的标志"\0","\0"是一个空字符标志,它的ASCII码为0,C++有好多处理字符串的函数,它们都以'\0'为结束标志,也就是以空字符为结束标志,比如说cin和cout,它们也是以空字符串为结束标志,假如它们在碰到空字符后将会停止输入或输出
三 char输入停止标志
3.1 停止标志
3.2 代码
1 2 3
| char man[12]; cin>>man; cout<<man;
|
3.3 输出结果
3.4 说明
- cin遇到空字符就停止输入,而我们在输入world时空了一格,因此我们看到输出的结果只是hello
- 解决的办法我们前面已经说过,就是使用cin.get
四 解决办法值——cin.get
4.1 代码
1 2 3
| char man[12]; cin.get(man,12); cout<<man<<endl;
|
4.2 说明
- cin.get的结束标志是'\n',也就是换行。因此遇到空格不会结束,而是把空格也看做一个字符,同时在输入结束后,也就是用户输入一个回车后,cin.get自动为当前接受输入的数组添加字符串结束标志'\0',因此它实际保存的有效字符是它的第二个参数减1,在本例中是(12-1)11个字符
4.3 代码
1 2 3
| char man[12]; cin.get(man,12); cout<<man<<endl;
|
4.4 输出结果
1 2
| faljlfjlajlfd dfafd faljlfjlajl
|
五 cout
5.1 概念
- cout遇到空字符也会停止输出,但是与cin不同的是,cout可以输出空格、制表符等空字符,或者说不可见字符
- 要注意空格与空字符还是有本质的区别的,空格的ASCII码为32,而空字符的ASCII码为0
- 注意,32没有加上单引号,这样编译器就会根据ASCII码值来寻找字符,ASCII码值为32的字符是空格,这样就会将空格保存到数组man中
5.2 输入输出说明
- cout遇到空字符就会停止输出,因此空字符后面的b没有输出,指输出了a
- 这就是关于输入和输出的一些问题。cin遇到不可见字符和空字符就停止输入(不可见字符指的是制表符和空格)。而cout则只是遇到空字符才停止输出。这就是为什么将空字符作为字符串结束标志的原因,cin和cout遇到空字符都会结束输入和输出操作
- man[99]:这样可以防止在要存储的字符很多时,超出数组末尾写入数据,也就是数组越界,当然这样的坏处就是浪费空间,因为处理字符串的函数根据空字符的位置,而不是字符的长度来进行处理。所以你为字符输出man多开辟出来的那些内存空间除了耗费系统内存之外没有什么实际用途。另外,C++不限制字符串长度,也就是说你可以将字符串数组的长度定义为无限大
六 char定义字符串
6.1 导入string类库
6.2 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<iostream> #include<cstring> using namespace std;
int main() { char man[12]={"hello world"}; cout<<man<<endl; cout<<"strlen(man):"<<strlen(man)<<endl; cout<<"sizeof(man):"<<sizeof(man)<<endl; man[5] ='\0'; cout<<man<<endl; cout<<"strlen(man):"<<strlen(man)<<endl; cout<<"sizeof(man):"<<sizeof(man)<<endl;
return 0; }
|
6.3 输出结果
1 2 3 4 5 6
| hello world strlen(man):11 sizeof(man):12 hello strlen(man):5 sizeof(man):12
|
6.4 说明
- 由于strlen返回的是字符串结束标志'\0'之前的字符串长度,而不是数组长度,所以返回的是5,因为第6个字符是字符串结束标志,不计算在内
- 而sizeof返回的是数组的长度,也就是该数组共有多少个元素