1. 4.2 字符串
字符串是存储在内存的连续字节中的一系列字符。
C++处理字符串的方式有两种:
来自C语言,常被称为C-风格字符串(C-sytle string)
给予string类库的方法
1.1. 字符串常量
C-风格字符串具有一种特殊的性质:以空字符(null character)结尾,空字符被写作\0
,其ASCII码为0,用来标记字符串的结尾。
🍑 例子:1
2char dog[8] = {'b','e','a','u','x','x',' ','I','I'}; // 不是string字符串
char cat[8] = {'b','e','a','u','x','x',' ','I','\0'}; // a string! 是字符串哦耶
这两个都是char,但只有第二个数组是字符串(因为有\0空字符)。
有一种比cat写法更好的将字符数组初始化为字符串的方法,用引号“”即可。
这种字符串被称为字符串常量string constant(字符串常量)或string literal(字符串面值);
1 | char bird[11] = "Mr.Cheeps"; // the \0 is understood |
由引号括起来的字符串隐式地包括结尾的空字符,因此不显式的写出来。
应该确保数组足够大, 能够存储字符串中的所有字符,包括空字符。
例子:char tryee[2] = {'1',';','s'};
错误提示:Excess elements in array initializer
- 字符常量(如’S’)是字符串编码的简写表示,字符串常量(如”bonjour”)与其不能互换。’S’在ASCII系统上,是’83’的另外一种写法;但”S”就不是字符常量,他表示的是字符S+\0的组合。
1.2. 拼接字符串常量
🍑 例子:
1 | cout << "I'd give my right arm to be" "a great violinist.\n"; |
和下面表达的是等效的。1
2cout << "I'd give my right ar"
"m to be a great vionlinist.\n"
1.3. 在数组中使用字符串
下面的code里重点函数为
strlen()
1
2
3#include <cstring>
strlen(一个string) 可以返回string的长度截断一个string的操作
在需要阶段的位置替换成’\0’
- sizeof()和strlen()的对比
sizeof()运算符是指出整个数组的长度,空字符计算在内
strlen()运算符是指出存储在数组中的字符串的长度,即可见的字符,不计算空字符
完整代码:
1 | #include <iostream> |
1.4. 字符串输入
🍑 例子:
1 | #include <iostream> |
要注意的是cin输入的时候,cin使用空白(空格,制表符和换行符)来确定字符串结束的位置,这意味着cin在获取字符串输入时指读取一个单词。
⚠️ 假如输入一个名字Alicia Keys,在这个例子里名字就是Alicia,dessert就是keys,cin一次性得到了两个输入,之后就直接跳到最后一个cout了。
⚠️另外,ArSize的大小为20,如果输入的字符串大于20的长度,也不行哦
1.5. 每次读取一行字符串输入 —— 面对行的输入
1.5.1. getline()将丢弃换行符
getline()将丢弃换行符,通过回车键确认输入结尾,可以使用方法cin.getline()
。
该函数有两个参数:
- 第一个参数存储输入行的数组的名称
- 第二个参数是要读取的字符数(如果这个参数是20,函数最多读取19个字符,最后一个存储空字符)
1.5.2. get()不丢弃换行符
get()的工作原理,参数和getline()类似,但get()不丢弃换行符,而是将其留在输入队列中。
但是不能用连续调用两次get()的方法如下:
🈲️
1 | cin.get(name,ArSize); |
🉑️采用下列做法:1
2
3cin.get(name,ArSize);
cin.get();
cin.get(dessert,ArSize);
🉑️也可以这样:1
2cin.get(name,ArSize).get(); // concatenate member functions, read newline
cin.get(dessert,ArSize);
1.6. 混合输入字符和数字
混合输入数字和面向行的字符串会导致问题。
修改方法:
- 第一种方法
(cin >> year).get()
- 第二种方法
cin >> year;
cin.get();