拼接字符串常量
C++ 允许拼接字符串字面值,即将两个用引号括起的字符串合并为一个。事实上,任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。
因此,下面所有的输出语句都是等效的:
cout << "I'd give my right arm to be" "a great violinist.\n";
cout << "I'd give my right arm to be a great violinsit.\n";
cout << "I'd give my right ar"
"m to be a great violinist.\n";
注意 拼接时不会在被连接的字符串之间添加空格,第二个字符串的第一个字符将紧跟在第一个字符串的最后一个字符(不考虑 \0 )后面。第一个字符串的 \0 字符将被第二个字符串的第一个字符取代。
getline(char *, int) 和 get(char *, int)
都是读取一行的输入
getline():
读取换行符,但随后将换行符丢弃,换成空字符。
该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数是20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。
getline() 成员函数在读取指定数目的字符或遇到换行符时停止读取。
cin.getline(name1, ArSize);
cin.getline(name2, ArSize);
// or
cin.getline(name1, ArSize).getline(name2, ArSize);
**get(): **
不读取并丢弃换行符,而是将其留在输入队列中。如果连续两次调用 get() ,会导致下一次 get() 出现问题,可以用 cin.get() 来处理换行符
cin.get(name, ArSize); // read first line
cin.get(); // read newline
cin.get(dessert,ArSize); // read second line
也可以进行拼接
cin.get(name, ArSize).get(); // concatenate member functions
cin.get(dessert, ArSize).get();
// error
cin.get(name, ArSize).get().get(dessert, ArSize).get();
注意:
在使用 cin >> a; 后,也会将回车键生成的换行符留在输出队列,再使用 cin.getline() 时需要先使用 cin.get() 或 cin.get(ch) 处理换行符。
cin >> a;
cin.get(); // or cin.get(ch);
// or
(cin >> a).get(); // or (cin >> a).get(ch);
// 利用表达式 cin >> a 返回 cin 对象,将调用拼接起来
空行和其他问题
当 get() (不是 getline() ) 读取空行后将设置失效位(failbit)。这意味着接下来的输入将被阻断,但可以用下面的命令来恢复输出。
cin.clear();
如果输入字符串可能比分配的空间长。如果输入行包括的字符数比指定的多,则 getline() 和 get() 将把余下的字符串留在输入队列中,而 getline() 还会设置失效位,并关闭后面的输入。
类设计让程序能够自动处理 string 的大小。例如,str1 的声明创建一个长度为 0 的 string 对象,但程序将输入读取到 str1 中时,将自动调整 str1 的长度。
cin >> str1; // str1 resized to fit input
这使得与使用数组相比,使用 string 对象更方便,也更安全。从理论上说,可以将 char 数组视为一组用于存储一个字符串的 char 存储单元,而 string 类变量是一个表示字符串的实体。
string 类简介
使用 string 对象的方式与使用字符数组相同
- 可以使用 C-风格字符串来初始化 string 对象
- 可以使用 cin 来将键盘输入存储到 string 对象中
- 可以使用 cout 来显示 string 对象
- 可以使用数组表示法来访问存储在 string 对象中的字符
string 对象和字符串数组的主要区别
可以将 string 对象声明为简单变量,而不是数组:
string str1; // create an empty string object
string str2 = "panther"; // create an initialized string
类设计让程序能够自动处理 string 的大小。例如,str1 的声明创建一个长度为0的 string 对象,但程序将输入读取到 str1 中时,将自动调整 str1 的长度:
cin >> str1; // str1 resized to fit input
这使得与使用数组相比,使用 string 对象更方便,也更安全。从理论上说,可以将 char 数组视为一组用于存储一个字符串的 char 存储单元,而 string 类变量是一个表示字符串的实体。
C++11 字符串初始化
C++11 也允许将列表初始化用于 C-风格字符串和 string 对象:
char first_date[] = {"Le Chapon Dodu"};
char second_date[] = {"The Elegant Plate"};
string third_date[] = {"The Bread Bowl"};
string fourth_date[] = {"Hank's Fine Eats"};
赋值、拼接和附加
不能将一个数组赋给另一个数组,但可以将一个 string 对象赋给令一个 string 对象:
char charr1[20]; // cre